Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

27.10.2008, 19:24

Frage zum Koordinatensystem in OpenGL

Hi,

ich habe mich gefragt, ob es nicht möglich ist, über die ProjektionsMatrix OpenGL zu 'sagen' welche Art von Koordinaten System man haben möchte.
Also dass man quasi über die ProjektionsMatrix angeben kann, ob man in OpenGL ein Linkshändiges- oder ein Rechthändiges Koordinatensystem haben will. Und ob man damit angeben kann, dass ein Positiver Z-Achsen Wert jedes Vertex vor- oder hinter der Kamera Position darstellt.

Ist das möglich??

Anonymous

unregistriert

2

27.10.2008, 20:01

http://www.opengl.org/resources/faq/technical/transformations.htm

Für dich dürfte neben den anderen Punkten vorallem dieser Punkt interessant sein:
9.150 Can I make OpenGL use a left-handed coordinate space?

3

27.10.2008, 20:03

Klar. Eine Matrix ansich kann ein Koordinatensystem darstellen, und wenn du einen Vektor aus irgendeinem anderen damit multiplizierst, wird er in dieses Koordinatensystem überführt.
Lerrne also möglichst viel über Matrixrechnung.

Für das z-Achsenproblem solltest du beispielsweise per Matrix die z Koordinaten mit -1 multiplizieren.
Lieber dumm fragen, als dumm bleiben!

Anonymous

unregistriert

4

27.10.2008, 20:08

Zitat von »"Jonathan_Klein"«

Lerrne also möglichst viel über Matrixrechnung.

Für das z-Achsenproblem solltest du beispielsweise per Matrix die z Koordinaten mit -1 multiplizieren.
Solltest du auch! Bitte unterlasse einfach demnächst Postings mit nur halben Inhalt - die verwirren mehr als sie helfen.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

28.10.2008, 16:50

Also ich hab das tatsächlich hinbekommen. Aud der OpenGL Seite steht zwar, dass man das mittels "glScalef(1, 1, -1)" korrigieren kann, aber ich hab einfach mit meiner eigenen Matrix Klasse die ProjektionsMatrix von OpenGL mit einem Linkshändigen Koordinaten System versehen ;)
Hat geklappt, aber leider sieht das SphereMapping jetzt nicht mehr korrekt aus. Die Normalen sind aber richtig berechnet und das Licht sieht immer noch ganz normal aus. Nur das Sphere mapping nicht mehr. Woran kann das genau liegen, bzw. was hat das SphereMapping mit der ProjektionsMatrix zu tun?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

28.10.2008, 16:56

OpenGL erlaubt es ja eine beliebige Matrix zu laden (glLoadMatrix). Statt vor jedem Renderdurchlauf also glLoadIdentity() aufzurufen kannst du einfach deine gewünschte Matrix laden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static const float s_leftHandedMat[16] =
{
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, -1, 0,
    0, 0, 0, 1
};

void Render()
{
    glClear( ... ); 
    // usw...


    glLoadMatrixf( s_leftHandedMat );

    // usf...

}


Und ta-daaa. "Lefthanded"! :-)

Solltest du der Meinung sein glLoadIdentity() macht irgendwelche wichtigen Statusänderungen in GL, dann kannst du auch die Identitätsmatrix laden und per glMultMatrix das Koordinatensystem wechseln:

C-/C++-Quelltext

1
2
3
// ... wie oben ...

glLoadIdentity();
glMultMatrixf( s_leftHandedMat );


Edit:

Zitat von »"LukasBanana"«

ich hab einfach mit meiner eigenen Matrix Klasse die ProjektionsMatrix von OpenGL mit einem Linkshändigen Koordinaten System versehen ;)


Lass doch die Projektionsmatrix in frieden... :-(
@D13_Dreinig

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

28.10.2008, 17:55

In der Irrlicht Engine gibt es in der matrix-Klasse aber auch extra zwei Funktionen: "buildProjectionMatrixPerspectiveFovLH" und "buildProjectionMatrixPerspectiveFovRH" ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

28.10.2008, 18:11

Brauchst du hier aber garnicht! :P
@D13_Dreinig

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

9

28.10.2008, 20:35

Ja, nicht zwangsläufig.
Aber ich möchte das nicht über eine negative Skalierung machen.
Wenn das in der Irrlicht Engine möglich ist, dann will ich auch ein richtiges links-händiges Koordinaten System ( auch wenn ich Rechtshänder bin XD )

Die Projektion der Vertices stimmt ja auch. Aber warum stimmen die Normalen Vektoren nicht?

Hier ist der Code, den ich aus der IrrlichtEngine habe (nur mit anderern Variablen Namen):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            f32 h = (f32)(1.0 / tan((FieldOfView * math::DEG64)/2.0));
            f32 w = h / Aspect;
            
            M[ 0] = (T)w;
            M[ 1] = 0;
            M[ 2] = 0;
            M[ 3] = 0;
            
            M[ 4] = 0;
            M[ 5] = (T)h;
            M[ 6] = 0;
            M[ 7] = 0;
            
            M[ 8] = 0;
            M[ 9] = 0;
            //M[10] = (T)( Far/(Far - Near) ); // DirectX version

            M[10] = (T)( (Far + Near)/(Far - Near) ); // OpenGL version

            M[11] = 1;
            
            M[12] = 0;
            M[13] = 0;
            //M[14] = (T)( -Near*Far/(Far - Near) ); // DirectX version

            M[14] = (T)( -2.0f*Near*Far/(Far - Near) ); // OpenGL version

            M[15] = 0;

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

29.10.2008, 08:38

Zitat von »"LukasBanana"«


Die Projektion der Vertices stimmt ja auch. Aber warum stimmen die Normalen Vektoren nicht?


Wie transformierst du die denn?
@D13_Dreinig

Werbeanzeige