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