Pra tentar ajudar alguém:
Como fazer escolha de objetos em 3D, usando o openFrameworks. Unindo o exemplo pointPicker a múltiplos objetos
Primeiro criar os objetos.
class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void keyPressed (int key); void keyReleased(int key); void mouseMoved(int x, int y ); void mouseDragged(int x, int y, int button); void mousePressed(int x, int y, int button); void mouseReleased(int x, int y, int button); void windowResized(int w, int h); void dragEvent(ofDragInfo dragInfo); void gotMessage(ofMessage msg); ofEasyCam cam; vector iPoints; bool click; int box; };
Depois configurar
#include "testApp.h" void testApp::setup(){ ofSeedRandom(); for (int x = 0; x < 5; x++){ ofPoint *p = new ofPoint; p->x = ofRandom(-100.0,+100.0); p->y = ofRandom(-100.0,+100.0); p->z = ofRandom(-100.0,+100.0); iPoints.push_back(p); } }
e depois a função draw, com a busca do box mais próximo
void testApp::draw(){ cam.begin(); vector::iterator a; for( a = iPoints.begin(); a != iPoints.end(); a++){ //ofTranslate(0,0,ofRandom(-100.0,+100.0)); ofEnableAlphaBlending(); ofFill(); ofSetColor(ofColor::blue,127); ofBox(*(*a),30); ofDisableAlphaBlending(); } ofDrawGrid(100); cam.end(); int i = 0; float nearestDistance = 0; ofVec2f nearestVertex; int nearestIndex; ofVec2f mouse(mouseX, mouseY); for( a = iPoints.begin(); a != iPoints.end(); a++) { ofVec3f boxPos; boxPos.x = (*a)->x;boxPos.y = (*a)->y;boxPos.z = (*a)->z; ofVec3f cur = cam.worldToScreen(boxPos); float distance = cur.distance(mouse); if( i==0 || distance < nearestDistance) { nearestDistance = distance; nearestVertex = cur; nearestIndex = i; } i++; } ofSetColor(ofColor::gray); ofLine(nearestVertex, mouse); ofNoFill(); ofSetColor(ofColor::yellow); ofSetLineWidth(2); ofCircle(nearestVertex, 4); ofSetLineWidth(1); ofVec2f offset(10, -10); ofDrawBitmapStringHighlight(ofToString(nearestIndex), mouse + offset); }