openFrameworks help – ofEasyCam + ofPointPicker

Padrão

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

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *