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);
}