Aktuelle Zeit: 03.05.2024, 21:34

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Sphere wird falsch beleuchtet
BeitragVerfasst: 11.01.2010, 18:24 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
Hallo zusammen!

Ich arbeite an einer Simulation, die einen Satelliten um die Erde kreisen lässt. Da es für den Anwender wichtig ist zu sehen, ob das MJD richtig in das JulianDate umgerechnet und alle Transformationsmatrizen und Positionen der Himmelskörper richtig berechnet werden, soll das Modell entsprechend der Sonnenposition beleuchtet werden. Genau da liegt das Problem, wenn ich Burningsvideo nehme wird die Kugel korrekt dargestellt, bei OpenGL/Direct3D habe ich einen scharfen Schatten. Ich habe schon alle möglichen Beleuchtungs-Optionen durchprobiert und auch schon getestet, ob es daran liegt dass die Normalen nicht normiert sind, weis jedoch nicht weiter.

Der entsprechende Code (für das Problem unwichtiges Zeug weg gelassen):
Code:
int main()
{

   EventReceiver receiver;
   video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
   IrrlichtDevice* device = createDevice(driverType, core::dimension2d<u32>(800, 600), 16, false, false, false, &receiver);

   IVideoDriver* driver = device->getVideoDriver();
   ISceneManager* smgr = device->getSceneManager();
   IGUIEnvironment* guienv = device->getGUIEnvironment();

   ISceneNode* mainNode = smgr->addEmptySceneNode(0);

   ICameraSceneNode* camNode = smgr->addCameraSceneNode(mainNode, vector3df(15000,0,0), vector3df(0,0,0));
   receiver.setNode(camNode,device);

   ISceneNode* systemNode = smgr->addEmptySceneNode(mainNode);
   smgr->setShadowColor();

   smgr->setAmbientLight(SColorf(0.1f,0.1f,0.1f,0.0f));
   ILightSceneNode* lightNode = smgr->addLightSceneNode(0,vector3df(300000,0,0),SColorf(1.0f,1.0f,1.0f,0.0f),10000000);

   IMeshSceneNode* earth = smgr->addSphereSceneNode (6371.0f,100,systemNode,-1,core::vector3df(0,0,0));
   earth->setMaterialTexture(0, driver->getTexture("earth_high_res.bmp"));

   int lastFPS = -1;
   while(device->run())
   {
      receiver.newFrame();
      driver->beginScene(true, true, SColor(255,100,101,140));
      smgr->drawAll();
      guienv->drawAll();
      driver->endScene();
   }
   device->drop(); return 0;
}


Burningsvideo:
Bild

OpenGL/Direct3D:
Bild


Über mögliche Lösungen des Problems würde ich mich sehr freuen.

MfG, Lufti


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Sphere wird falsch beleuchtet
BeitragVerfasst: 11.01.2010, 20:04 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
http://de.wikipedia.org/wiki/Tag-Nacht-Grenze

Die Tag-Nacht-Grenze ist nunmal wirklich nicht sehr breit ;)

Für mich wird der Schatten unter Dx/Ogl physikalisch korrekt dargestellt.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Sphere wird falsch beleuchtet
BeitragVerfasst: 11.01.2010, 22:50 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
Leider nein. Wenn ich gouraud-shading deaktiviere, zeigt sich, dass der Schatten wirklich eine scharfe Kante ist. Das Problem besteht im übrigen, wie ich inzwischen feststellen musste, nicht nur bei der Kugel, sondern auch bei anderen Modellen. Dies zeigt sich insbesondere bei einem Satellitenmodell. Alle Flächen, die von der Lichtquelle beschienen werden, sind gleich hell, unabhängig davon, in welchem Winkel das Licht einfällt. Das führt bei dem Satelliten dazu, dass man die dreidimensionale Form überhaupt nicht erkennen kann, solange keine Textur darauf liegt, da man keine Unterschiede zwischen den einzelnen Flächen erkennt. Ich schliesse daraus, dass an meinem Code irgendwas fehlerhaft ist.
Wenn gewünscht, erstelle ich Morgen noch ein paar weitere Bilder sobald ich auf Arbeit bin. ;-)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Sphere wird falsch beleuchtet
BeitragVerfasst: 12.01.2010, 02:02 
Offline

Registriert: 12.01.2010, 01:55
Beiträge: 3
Du sagst, du hättest schon geprüft ob es an den Normalen liegt? Versuch trotzdem nochmal das EMF_NORMALIZE_NORMALS Flag für die earth zu setzen


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Sphere wird falsch beleuchtet
BeitragVerfasst: 12.01.2010, 11:07 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
Wie bereits erwähnt, hatte ich das normalisieren der Normalen schon ausprobiert, ich hab es jedoch erneut eingesetzt. Der Code-Abschnitt sieht dann wie folgt aus:
Code:
   IMeshSceneNode* earth = smgr->addSphereSceneNode (6371.0f,100,systemNode,-1,core::vector3df(0,0,0));
   earth->setMaterialTexture(0, driver->getTexture("Pictures/earth_high_res.bmp"));
   earth->setMaterialFlag(EMF_NORMALIZE_NORMALS, true);
   earth->setMaterialFlag(EMF_GOURAUD_SHADING, false);

Ist das so richtig?

Was mich auf die Idee mit dem Normalisieren der Normalen gebracht hat ist übrigens der Bereich am Nordpol meiner Erde, der im Gegensatz zum rest schattiert dargestellt wird. Das lies mich darauf schliessen, dass die Normalen zu lang sein müssten, da nur dies die Tatsache erklären würde, dass Flächen schon bei sehr kleinen Winkeln voll beleuchtet werden. Der Bereich am Nordpol zeigt ja, dass bei winzigen Winkeln (-> größe der Normalen wird kompensiert) die Schattierung funktioniert.

Hier noch ein Bild vom Nordpol:
Bild

Und eines von der ganzen Erde ohne gourad-shading:
Bild


Zuletzt geändert von Lufti am 12.01.2010, 14:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Sphere wird falsch beleuchtet
BeitragVerfasst: 12.01.2010, 11:58 
Offline

Registriert: 12.01.2010, 01:55
Beiträge: 3
Nein, du musst
Code:
earth->setMaterialFlag(EMF_NORMALIZE_NORMALS, true);
setzen. Damit sagst du der GPU das sie die Normalen also nochmal normalisiert bevor gerendert wird.
Hab grad nicht die Möglichkeit zu testen, bin mir aber ziemlich sicher dass es dann klappen sollte.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Sphere wird falsch beleuchtet
BeitragVerfasst: 12.01.2010, 14:24 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
In den Code hab ich natürlich richtig rein gesetzt, hatte nur getestet ob sich irgendwas verändert, wenn man es absichtlich auf false setzt und dann das Code-Segment hier reinkopiert ohne das vorher zu ändern. Es passiert wirklich nichts wenn man das aus oder ein schaltet...


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Sphere wird falsch beleuchtet
BeitragVerfasst: 12.01.2010, 14:54 
Offline

Registriert: 12.01.2010, 01:55
Beiträge: 3
Hab das grad mal ausprobiert und du hast recht, das Normalisieren hat nichts gebracht. Stellt man allterdings den Radius des Lichts kleiner wird die Beleuchtung besser. Liegt wohl daran, dass die Lichtstärke linear zur Entfernung abnimmt und das Licht in relativer Nähe dann sehr stark ist. Das findet man auch in der Irrlicht API:
Zitat:
Setting the radius will also influence the attenuation, setting it to (0,1/radius,0). If you want to override this behavior, set the attenuation after the radius.

Vielleicht ist es in deinem Beispiel besser
Code:
Attenuation = core::vector3df(1,0,0);
zu setzen, so dass das Licht konstant ist, also nicht mit der Entfernung abnimmt.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Sphere wird falsch beleuchtet
BeitragVerfasst: 12.01.2010, 16:51 
Offline

Registriert: 11.01.2010, 18:05
Beiträge: 11
Perfekt, es klappt. Du bist mein Held des Tages!


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

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de