3D-Kamera (FPS, Maya, ...) und Mauskoordinaten X,Y - Wie findet man die getroffenen Körper (Nodes)? [gelöst]



  • Eine typische Situation: Man hat eine bewegliche 3D-Kamera (FPS, Maya, ...) und zusätzlich noch Mauskoordinaten (X,Y) von der 2D-Bildschirmfläche. Wie findet man nun die getroffenen Körper (Nodes), z.B. zur Auswahl von Flächen oder Körpern?
    Kann man da etwas mit near value, far value, aspect ratio machen? Bei meiner Maya-Kamera in Irrlicht z.B. near = 1, far = 3000, aspect ratio = 1,333.
    Bietet Irrlicht gar schon etwas? Wie macht ihr das?


  • Mod

    hab nicht so ganz verstanden was du willst, aber koennte es sein dass du 'picking' meinst? gibt einige resultate bei google in zusammenhang mit irrlicht 😉



  • Vielleicht kannst Du mir doch noch weiter helfen.

    Normalerweise findet man das Picking mittels "look at" der Kamera. Typisch ist hier z.B.:

    selectedSceneNode = 
    smgr->getSceneCollisionManager()->getSceneNodeFromCameraBB(camera);
    

    Aber das ist nicht, was ich will. Ich will nicht mit dem Auge "picken", sondern "mit der Hand darauf zeigen", sprich mit der Maus klicken. Dafür benötige ich die Einbeziehung/Umrechnung der X,Y-Position in der near clipping Ebene (das ist doch die Ebene, auf die ich mit der Maus klicke?). Ich habe folgende Stelle gefunden http://gpwiki.org/index.php/VB:3Dmouse (wirklich interessant für das Grundlagenverständnis) bin aber sicher, dass das mit der Irrlicht Engine einfacher gehen muss. Es muss doch eine einfache Funktion geben, die folgendes macht:

    bool SceneNode->isIntersected(SEvent::SMouseInput::Event emiEvent, ICameraSceneNode* nodeCamera)
    

    Das wäre toll! 😕



  • ..



  • Glücklicherweise bietet Irrlicht hier nach einiger Suche doch etwas:
    **getSceneCollisionManager()
    getRayFromScreenCoordinates(...)
    getIntersectionWithSphere(...)
    **
    Damit kann man sich etwas behelfen.

    SEvent::SMouseInput emi = receiver.GetMouseInput(); //selbst entwickelter receiver
    line3df line;
    if (emi.Event == EMIE_LMOUSE_PRESSED_DOWN) 
    { 
      ISceneCollisionManager* scmgr = smgr->getSceneCollisionManager();
      line = scmgr->getRayFromScreenCoordinates(position2d<s32>(emi.X,emi.Y));
      for( int i=0; i<COUNT_OF_NODES; ++i ) 
      {
        f64 outdistance;
        if(line.getIntersectionWithSphere( boardPos[i], 5*SIZESQUARE, outdistance) )
        {
          posValue = i;
          light1->setPosition(lightPos[posValue]);
        }
      }
    }
    

    Warum gibt es kein "getIntersectionWithCube"?
    Man kann auch die Schnittstellen prüfen zwischen ausgewählten Dreiecken und dieser 3D-Geraden.
    getRayFromScreenCoordinates(...) ist also die gesuchte Funktion gewesen, war etwas versteckt.


Anmelden zum Antworten