Problem mit linkshändigem Koordinaten System in OpenGL
-
Ich habe in meiner OpenGL Anwendung das Koordinaten System selbst per "glLoadMatrixf" angegeben - Also die ProjektionsMatrix.
Ich habe ein linkshändiges Koordinaten System genommen weil ich will, dass ein positiver Wert der Z Achse nach vorne, und nicht nach hinten verlaufen soll.
Das funktioniert auch, jedenfalls werden die Vertices richtig positioniert, sogar das Diffuse Licht. Aber, was nicht funktioniert sind genau zwei Dinge: das Specular Licht und Sphere Mapping funktioniert nicht mehr.
Ich verstehe nicht warum aber der Rest korrekt projeziert wird.Hier ist meine Funktion, zum Erstellen der Projektions-Matrix:
const double DEG64 = M_PI / 180.0; void setPerspectiveLH(float FieldOfView, float Aspect, float Near, float Far) { float h = (float)(1.0 / tan((FieldOfView * DEG64)/2.0)); float w = h / Aspect; M[ 0] = w; M[ 1] = 0; M[ 2] = 0; M[ 3] = 0; M[ 4] = 0; M[ 5] = h; M[ 6] = 0; M[ 7] = 0; M[ 8] = 0; M[ 9] = 0; //M[10] = ( Far/(Far - Near) ); // DirectX version M[10] = ( (Far + Near)/(Far - Near) ); // OpenGL version M[11] = 1; M[12] = 0; M[13] = 0; //M[14] = ( -Near*Far/(Far - Near) ); // DirectX version M[14] = ( -2.0f*Near*Far/(Far - Near) ); // OpenGL version M[15] = 0; } // Meine Werte sind dann: "setPerspectiveLH(74.0f, 4.0 / 3.0, 0.1f, 1000.0f)"Kann mir jemand sagen waron das liegt, und wie ich das richtig machen kann?
PS: Die Funktion macht im Grunde das gleiche wie die aus der Irrlicht-Engine.
-
Sphere Mapping funktioniert nicht mehr
Dadurch dass Du die Z-Achse der Projektionsmatrix negiert hast, guckst Du jetzt sozusagen von hinten auf Deine Objekte.
Dudurch ist Dir gerade die "Seite" der Environment-Map mit den staerksten Verzerrungen (aeusserer Rand, vgl hier) zugewandt.
Man koennte das kompensieren indem man auch die Normalen invertiert (und die Map entsprechend aufbaut); der Sinn des Gesamtkonzeptes entgeht mir aber noch.
-
Mh, wenn man die Normalen dann auch noch invertieren muss UND auch noch die Normalmap ändern muss hat das ganze wirklich keinen Sinn.
Aber Direct3D9 bietet doch auch zwei unterschiedliche Koordinaten system an:
ein rechts- und ein linkshändiges.Auch die Irrlicht Engine nutzt ein linkshändiges, also muss es doch irgendwie möglich sein das auch mit OpenGL hinzubekommen, oder?!
Ich will meine Engine auch Renderer unabhängig schreiben, und ein linkshändiges Koordinaten System finde ich besser. Mit Direct3D9 funktioniert die SphereMap wunderbar.
-
Bei Sphere-Mapping geht man fuer geowehnlich davon aus, dass die Environment-Map dem Betrachter zugewandt ist - eben damit man die Texturverzerrungen (dann auf der Rueckseite) nicht sieht; das setzt natuerlich voraus dass man weiss, wo der Betrachter ist.
Fuer eine Fixed-Function-Pipeline ist es durchaus legitim, annahmen ueber das verwendete Koordinatensystem zu machen. Wenn Du dieses Koordinatensystem nun nicht nutzen moechtest musst Du die noetigen Berechnung eben selbst erledigen.Mit Direct3D9 funktioniert die SphereMap wunderbar
Das liegt daran, dass Direct3D lediglich die Normale in die Spheremap abbildet waehrend OpenGL den View-Vektor tatsaechlich an der Oberflaeche spiegelt.
-
Also währe es vernünftiger unter OpenGL weitetrhin ein rechtshändiges Koordinaten System zu verwenden, aber dafür einfach von Anfang an die ModelviewMatrix an der Z-Achse invertieren.
Also das die ModelviewMatrix zu Beginn des Renderns immer so aussieht:1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1