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?
-
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.