Aktuelle Zeit: 28.04.2024, 21:29

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 2D Koordinaten auf 3D übertragen
BeitragVerfasst: 19.08.2007, 15:30 
Offline

Registriert: 16.08.2007, 15:22
Beiträge: 34
Hi,

Es geht um folgendes, ich muss die 2D Koordinaten (die der Maus) auf 3D übertragen, also da wo meine Maus grad auf 2D Koordinaten ist soll in der 3D Welt z.b. ein Objekt sein. Geht sowas?

Mfg

BlitzBasic303


Nach oben
 Profil  
 
BeitragVerfasst: 19.08.2007, 16:17 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Klar geht das.
Allerdings brauchst du zusätzliche Informationen für Irrlicht, damit es wissen kann, wo das Objekt sein soll:
zB kannst du eine Fläche im dreidimensionalen Raum nehmen, auf der das Objekt sein soll. Dann berechnest du mit Irrlicht die Kollision des Strahls, der von einer bestimmten Bildschirmposition ausgeht, mit dieser Fläche:

Mittels ISceneCollisionManager::getRayFromScreenCoordinates bekommst du den Strahl, per plane3d::getIntersectionWithLimitedLine lässt du deine Fläche mit dem Strahl kollidieren, der Kollisionspunkt liegt danach in outIntersection.

Links:
http://irrlicht.sourceforge.net/docu/cl ... er.html#a2
http://irrlicht.sourceforge.net/docu/cl ... 3d.html#a3

Ich weiß jetzt nicht, wie lang die von getRayFromScreenCoordinates zurückgegebene Linie ist, wenn sie zu kurz ist, musst du sie in die Form Startpunkt/Vektor umwandeln und dann getIntersectionWithLine benutzen.

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 19.08.2007, 17:51 
Offline

Registriert: 16.08.2007, 15:22
Beiträge: 34
Hi,

danke für die schnelle Antwort, ich hab allerdings noch eine Frage dazu, was genau gibt getRayFromScreenCoordinates zurück, in dem Link von dir steht er gibt einen Strahl(Ray) zurück, aber in welcher Form? Als Koordinaten mit Start und Endpunkt oder als Objekt? Und was gebe ich bei getIntersectionWithLimitedLine für Punkte an? Und bei getIntersectionWithLimitedLine muss man ja noch einen 3ten Parameter angeben, vector3d< T > & outIntersection was bedeutet das, ich dachte in outIntersection steht dann der Kollidierte punkt?


Nach oben
 Profil  
 
BeitragVerfasst: 19.08.2007, 20:30 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Der Strahl wird als line3d zurückgegeben, in line3d::end bzw line3d::start stehen dann Start/Endwert der Linie.

"vector3d< T > & outIntersection" bedeutet, dass der Punkt als Referenz übergeben wird. Das funktioniert dann wie ein Pointer, sobald die Funktion etwas in diese Variable rein schreibt, wird sie auch in deinem Programm geändert. Das "&" ist dabei wichtig. Du setzt jedoch einfach ganz normal deine Variable da ein, ohne ein "&", sonst wäre es ja ein Pointer.
Direkt zurückgegeben wird lediglich ein bool, der anzeigt, ob tatsächlich eine Kollision stattgefunden hat, d.h. ob nach outIntersection ein gültiger Wert geschrieben wurde.

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 20.08.2007, 13:59 
Offline

Registriert: 16.08.2007, 15:22
Beiträge: 34
Ok, so ungefähr hab ich mir das jetzt mal zusammengereimt, aber mir war von Anfang an klar dass das so nie funktionieren kann, und was war? Fehler ohne Ende, nicht anders zu erwarten :( Ich hab leider überhaupt keine Anhung wie man es richtig anwended...

Code:
      
   core::line3d<f32>*Linie=0;
   
   while(device->run())
   {   
      driver->beginScene(true, true, SColor(255,100,101,140));
      smgr->drawAll();
      guienv->drawAll();
      
       Linie=irr::scene::ISceneCollisionManager::getRayFromScreenCoordinates(core::position2d<s32>(100,100),  ICameraSceneNode * camera )   
       if(irr::core::plane3d< T >::getIntersectionWithLimitedLine(const vector3d< T > & line3d::start(Linie), const vector3d< T > &     line3d::end(Linie), vector3d< T > & outIntersection)=true)
       {
                PointerNode->setPosition(core::vector3df(line.end));
        }
      driver->endScene();
   }
   


Hoffe du kannst mir nochmal helfen...

PS: das 100,100 steht stellvertretend für die Mauskkordinaten, wie findet man die heraus?


Nach oben
 Profil  
 
BeitragVerfasst: 20.08.2007, 19:38 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Naja, zu dem Code sage ich lieber nix ;)
So sollte es schon eher funktionieren, aber nicht ausprobiert, ich weiß auch nicht genau, ob der Code für die Fläche so stimmt (oder ob überhaupt estwas stimmt, sollte aber).
Code:
core::line3d<f32>Linie=0;
   
   while(device->run())
   {   
      driver->beginScene(true, true, SColor(255,100,101,140));
     
       Linie=smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(core::position2d<s32>(100,100), camera);
       core::plane3df Flaeche(core::vector3df(0, 0, 0), core::vector3df(0, 1, 0));
       core::vector3df Kollision;
       if(Flaeche.getIntersectionWithLimitedLine(Linie.start, Linie.end, Kollision)=true)
       {
                PointerNode->setPosition(Kollision);
        }
      smgr->drawAll();
      guienv->drawAll();
      driver->endScene();
   }
   


Anmerkungen:
- Wichtig ist, dass du erst die Position berechnest, und danach per ISceneManager->drawAll() zeichnest, sonst wird PointerNode mit einem Frame Verzögerung versetzt.
- Für "camera" musst du den Namen deiner Kamera einsetzen.
- das erste Argument bei der Erstellung von Flaeche kennzeichnet afaik den Ursprungspunkt der Fläche, das zweite die Richtung. PointerNode wird immer an der Y-Koordinate der Fläche erscheinen, du kannst die Höhe verändern, indem du zB Werte wie "Flaeche(core::vector3df(0, 5, 0), core::vector3df(0, 1, 0));" einsetzt.
- Linie ist kein Pointer, sondern eine normale Variable.
- Du musst die in der Dokumentation aufkommenden Typnamen schon durch echte Variablen ersetzen ;)

Die Mausposition bekommst du durch gui::ICursorControl::getPosition(), einen Pointer vom Typ gui::ICursorControl bekommst du durch device->getCursorControl(). Versuch da mal aus der Dokumentation dir deinen Code zu schreiben ;)
http://irrlicht.sourceforge.net/docu/cl ... ntrol.html

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 20.08.2007, 21:43 
Offline

Registriert: 16.08.2007, 15:22
Beiträge: 34
Ich habs probiert und ..
.. bin gescheitert ..

Was auch sonst, also C++ ist doch sehr viel komplizierter als Basic, besonders wenn mans noch nicht kann :(

Ich weiß leider noch nicht mal wie man device->getCursorControl() anwended, wenn ichs einfach so hinschreibe gibts fehler, wenn ich irgendwas dran ändere gibts noch mehr fehler, also ich glaub wenn ichs mal vestehe werd ich n Tutorial schreiben :o

Naja kann nur darauf hoffen das du mir das alles auch für dumme erklärst, da es ja leider für sowas bisher kein Tut gibt.

Bei deinem Code gibt einen Fehler bei core::line3d<f32>Linie=0; hab schon viel damit rumprobiert "Linie" richtig zu deklarieren, aber ich glaub ich hab das Prinzip noch nicht ganz raus.

Mfg

Blitz303


Nach oben
 Profil  
 
BeitragVerfasst: 21.08.2007, 18:27 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Zitat:
Was auch sonst, also C++ ist doch sehr viel komplizierter als Basic, besonders wenn mans noch nicht kann :(


Ups... das mit dem "core::line3d<f32>Linie=0;" War ja auch komplett falsch. "core::line3d<f32>Linie;" reicht ja, da die Variable später gefüllt wird.

Zu device->getCursorControl():
device ist hier eine Variable/Pointer vom Typ IrrlichtDevice. Die Dokumentation sagt da folgendes:
Zitat:
virtual gui::ICursorControl * getCursorControl ()=0

(Das =0 und das virtual kannst du erst mal vergessen, unwichtig)
Das sagt folgendes aus: Die Funktion erwartet keine Parameter. Logisch. Und sie gibt eine Variable bzw einen Pointer vom Typ "gui::ICursorControl *" zurück. Das bedeutet, dass du erst mal eine Variable von dem Typ erstellen musst, in die du den Rückgabetyp speicherst.
Also so:
gui::ICursorControl *cursorcontrol;
cursorcontrol = device->getCursorControl();
Alternativ:
gui::ICursorControl *cursorcontrol = device->getCursorControl();

Jetzt kannst du alle Funktionen von ICursorControl über diese Variable ausführen.

Im Zweifelsfall kann ich dir auch per ICQ helfen (306214707), evtl geht das schneller/besser.

EDIT:
Deine Instanz der Irrlicht-Engine (das, was du durch createDevice erhälst), muss natürlich "device" heißen. Wenn nicht, musst du die Funktionen entsprechend umändern.

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de