Aktuelle Zeit: 12.05.2025, 15:34

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Rotation
BeitragVerfasst: 29.03.2010, 08:52 
Offline

Registriert: 29.03.2010, 08:40
Beiträge: 2
Hallo allerseits,
ich habe die ersten Schritte mit Irrlicht hinter mir, doch nun stehe ich an einem Problem, bei dem ich trotz längerer Suche nicht weiter komme.
Ich hatte vor, eine Szene zu erstellen, bei der die Laufbahn von Mond und Erde um die Sonne simuliert wird, was mir auch recht gut gelungen ist. Da ich mich steigern wollte, versuchte ich, die einzelnen ISceneNodes (Sonne,Mond,Erde) mittels draw3DLine und ISceneNode->getAbsolutePosition() zu verbinden, was jedoch dazu führt, dass diese Linien ausserhalb der eigentlichen Planeten "wandern". Also musste es an den Matrizen liegen und nach mehreren Versuchen fand ich den Fehler. Wenn ich die Sonne mittels Sonne->setRotation(core::vector3df(0.0f, fWinkel, 0.0f)); drehe, dann erfolgt auch eine Drehung der Linien. Wenn Ihr mich jetzt fragt, warum sich die Linien mit der Sonne drehen, dann kann ich leider keine Antwort geben. Da sich die Sonne scheinbar zu schnell dreht, drehen sich auch die Linien zu schnell mit der Szene mit und wandern nicht mit den zugeordneten Himmelskörpern. Muss man hier die Matrizen alá OpenGl pushen und poppen ? Es wäre super, wenn mir jemand nur einen Link zu einer Lösung geben könnte :? Zum verdeutlichen hier der momentane Quellcode :
Code:
//Einbinden der Header-Datei von Irrlicht
#include <irrlicht.h>

//Einbinden der Namespaces
using namespace irr;
using namespace core;
using namespace video;

//Die Hauptprozedur main()
int main()
{
   //Unser Irrlicht-Device erstellen und initialisieren
   IrrlichtDevice *device =
      createDevice( video::EDT_OPENGL, dimension2d<u32>(640, 480), 32,
         false, false, false, 0);

   //Konnte das Device erstellt werden ?
   if (!device)
      return 1; //Falls nicht, Fehlercode zurückgeben und Programm abbrechen

   //Den Text des Hauptfensters festlegen
   device->setWindowCaption(L"Rotation,Translation u. Skalierung von Objekten !");

   //Den Videotreiber erstellen und Zeiger aus dem Device abholen
   IVideoDriver* driver = device->getVideoDriver();   
   
   //Einen Szene-Manager erstellen und Zeiger aus dem Device abholen
   scene::ISceneManager* smgr = device->getSceneManager();
   
   //Erstellen der SceneNodes   
   scene::ISceneNode * Sonne = smgr->addSphereSceneNode(1.0f);
   scene::ISceneNode * Erde = smgr->addSphereSceneNode(0.5f);
   scene::ISceneNode * Mond = smgr->addSphereSceneNode(0.3f);

   //Einstellen des Materials
   Sonne->setMaterialTexture(0, driver->getTexture("Brick.jpg"));
   Erde->setMaterialTexture(0, driver->getTexture("Brick.jpg"));
   Mond->setMaterialTexture(0, driver->getTexture("Brick.jpg"));

   //Keine Lichtberechnung
   Sonne->setMaterialFlag(EMF_LIGHTING, false);
   Erde->setMaterialFlag(EMF_LIGHTING, false);
   Mond->setMaterialFlag(EMF_LIGHTING, false);   
   
   /*scene::ISceneNodeAnimator* anim =
                        smgr->createRotationAnimator(core::vector3df(0,0.2f,0));
   Sonne->addAnimator(anim);
   anim->drop();

   scene::ISceneNodeAnimator* anim2 =
      smgr->createFlyCircleAnimator(core::vector3df(0,0,0),
                              2.0f,
                              0.0005f);
   Erde->addAnimator(anim2);
   anim2->drop();*/

   core::vector3df EarthPos; //Positionsvektor unserer Erde
   core::vector3df MoonPos; //Positionsvektor unseres Monds
   
   //Unser 32Bit-Float zum Speichern des Texturwinkels
   f32 fWinkel = 0.0;
   f32 fWinkel_Erde = 0.0;

   //Unsere Variablen zur Zeitsteuerung
   u32 uiZuletztGestoppt = device->getTimer()->getTime(); //Aktuelle Zeit stoppen
   const u32 uiDeltaTime = 50; //Textur alle 50ms drehen

   //Einen GUI_Manager erstellen und Zeiger aus dem Device abholen
   gui::IGUIEnvironment* guienv = device->getGUIEnvironment();

   //Ein Text-Element definieren und an den GUI-Manager übergeben
   gui::IGUIStaticText* GUI_debug_text = guienv->addStaticText
      (L"",rect<s32>(5, 5, 300, 300),false,true,0,-1,false);

   //Eine Kamera erstellen
   smgr->addCameraSceneNode(0, core::vector3df(0,4,-4), core::vector3df(0,0,0));   

   //Während das Device aktiv ist ...
   while(device->run())
   {      
      //Szene beginnen
      driver->beginScene(true, true, SColor(3,150,203,255));      

      //Errechnen der Position der Erde
      EarthPos = core::vector3df((3*sin(fWinkel / 100)), 0, (3*cos(fWinkel / 100)));
      
      //Errechnen der Position des Monds
      MoonPos = core::vector3df(
         EarthPos.X + (1.2 * sin(fWinkel/10)),
         0,
         EarthPos.Z + (1.2 * cos(fWinkel/10))
         );

      //Nach Ablauf von Delta Time
      if (device->getTimer()->getTime() > (uiZuletztGestoppt + uiDeltaTime))
      {
         //Neuen Zeitpunkt merken
         uiZuletztGestoppt = device->getTimer()->getTime();
         //Winkel erhöhen
         fWinkel += 1.0f;
         fWinkel_Erde -= 2.0f;         
      }
      
      //Drehen der Sonne
      /********* hier liegt der Fehler *************/
       Sonne->setRotation(core::vector3df(0.0f, fWinkel, 0.0f));      
      /********* hier liegt der Fehler *************/

      //Erde positionieren und rotieren
      Erde->setRotation(core::vector3df(0.0f, fWinkel_Erde , 0.0f));      
      Erde->setPosition(EarthPos);
      
      //Mond positionieren und rotieren
      Mond->setPosition(MoonPos);
      Mond->setRotation(core::vector3df(0.0f, fWinkel_Erde , 0.0f));   

      driver->draw3DLine(Sonne->getAbsolutePosition(), Erde->getAbsolutePosition(),SColor(255,255,0,0));
      driver->draw3DLine(Erde->getAbsolutePosition(), Mond->getAbsolutePosition(),SColor(255,255,0,0));      
      
      //Dem Szenemanager sagen, dass er alle Nodes zeichnen soll
      smgr->drawAll();      

      //String erstellen
      core::stringw tmp(L"Rotation,Translation u. Skalierung von Objekten in Irrlicht\nTreiber : ");
      tmp += driver->getName();
      tmp += L"\n FPS: ["; tmp += driver->getFPS();
      tmp += "]\nDreiecke gezeichnet : ";
      tmp += driver->getPrimitiveCountDrawn();;
      tmp += "\nGrafikkarte ist von : ";
      tmp += driver->getVendorInfo();
      tmp += "\nLetzter Zeitstopp : ";
      tmp += uiZuletztGestoppt;
      tmp += "\nPosition Erde (XYZ): ";
      tmp += EarthPos.X; tmp += " ";
      tmp += EarthPos.Y; tmp += " ";
      tmp += EarthPos.Z;
      tmp += "\nPosition Mond (XYZ): ";
      tmp += MoonPos.X; tmp += " ";
      tmp += MoonPos.Y; tmp += " ";
      tmp += MoonPos.Z;
      
      //String anzeigen
      GUI_debug_text->setText(tmp.c_str());      

      //Dem GUI-Manager sagen, dass er alle GUIs zeichnen soll
      guienv->drawAll();

      //Szene beenden
      driver->endScene();
   }
   //Das Device freigeben
   device->drop();
   
   //Keinen Fehler zurückgeben
   return 0;
}


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit Rotation
BeitragVerfasst: 24.04.2010, 20:26 
Offline

Registriert: 12.09.2008, 21:41
Beiträge: 187
Wohnort: Deutschland
Hi,

schreib mal:
Code:
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
driver->draw3DLine(Sonne->getPosition(), Erde->getPosition(),SColor(255,255,0,0));
driver->draw3DLine(Erde->getPosition(), Mond->getPosition(),SColor(255,255,0,0));     


MfG
Scarabol

_________________
My Toolbox:
- Irrlicht 1.7.1
- Blender 2.49a
- Microsoft Visual C++ Express Edition 2008
- Newton Game Dynamics 2.xx
Regeln zur Programmierung:
Regel 1: Die Programmiersprache hat keine Fehler.
Regel 2: Solltest du doch einen Fehler finden, tritt automatisch Regel 1 in Kraft.


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

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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