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

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

10.05.2016, 23:53

Orthogonale Projektion errechnen

Hi,
wie der Titel schon andeutet möchte ich eine Orthogonale Projektionsmatrix
errechnen, damit ich 2D Sprites mit Koordinaten auf den Screen klatschen kann.

Ich habe mich bei dem Algorithmus ganz dreist bei 'glOrtho's Man Page orientiert.
Dabei kam folgendes heraus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
        void    orthogonalProjection(float* pMatrix, float left, float right, float bottom, float top, float far, float near){
            identity(pMatrix);
            pMatrix[0]  = 2.0f / (right - left);
            pMatrix[3]  = - (right + left) / (right - left);
            pMatrix[5]  = 2.0f / (top - bottom);
            pMatrix[7]  = - (top + bottom) / (top - bottom);
            pMatrix[10] = -2.0f / (far - near);
            pMatrix[11] = - (far + near) / (far - near);
            pMatrix[15] = 1.0f;
        }


Leider bekomme ich einen leeren Viewport dadurch. Ist die Projektionsmatrix eine Identitätsmatrix,
dann sehe ich zum Glück meine Sprites wieder, jedoch sind diese im Clipspace.

Errechne ich irgendetwas falsch?
LG Julien

P.S.: Mein Shader sieht so aus:

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
            #version 330 core

            layout (location = 0) in vec3 pos;
            layout (location = 1) in vec2 _uv;

            uniform mat4 projection;
            uniform mat4 model;
            out vec2 uv;

            void main(){
                gl_Position = projection * model * vec4(pos.xy, 0.0, 1.0);
                uv = _uv;
            };
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Julién« (11.05.2016, 00:11)


Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

2

11.05.2016, 01:20

Ich konnte das Problem jetzt lösen, in dem ich einfach D3DXMatrixOrthoLH kurz für OpenGL missbraucht habe.

Mir ist aufgefallen, dass die Funktionen für *LH und *RH sich komplett von 'glOrtho' unterscheiden.
Woran liegt das?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

11.05.2016, 01:42

glOrtho() macht eine allgemeine off-center Projection. Wenn du dir stattdessen mal D3DXMatrixOrthoOffCenterRH() anschaust, wird dir auffallen, dass die dann dasselbe tut wie glOrtho()... ;)

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

11.05.2016, 09:55

LH und RH sind halt grundverschiedene Koordinatensysteme. LH ist "Left Handed", RH ist "Right Handed". Nimm die linke Hand, halt den Daumen nach oben, den Zeigefinger nach vorn wie eine fiktive Waffe und dann strecke den Mittelfinger seitwärts aus. Das ist Left Handed. Und jetzt nimm die rechte Hand, halte den Daumen ebenso nach oben, den Zeigefinger ebenso nach vorn, reisse kurz einen ChuckNorris-Witz, dann strecke den Mittelfinger seitwärts ab. Dir fällt auf: die beiden Koordinatensysteme sind zueinander gespiegelt. Keine Rotation der Welt kann das eine KS in das andere KS umwandeln.

Es ist reine Geschmackssache, ob man nun in LH oder RH rechnet, solange man konsequent ist. Ich bin ein altes DirectX-Kind und fühle mich daher im LH wohl und benutze das KS auch in OpenGL. Andere Leute mögen RH lieber, und solange sie sich konsequent daran halten, funktioniert auch alles. Man muss nur bedenken, dass der Clip Space von OpenGL am Ende LH ist, wenn man die Projektionsmatrix selbst schreibt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Julién

Alter Hase

  • »Julién« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

5

11.05.2016, 10:45

Den Unterschied zwischen LH und RH kenne ich schon, dennoch Danke.

@Dot: Wo ist genau der Unterschied zu einer 'OffCenter' und nicht 'OffCenter' Matrix?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

11.05.2016, 12:58

Bei einer off-center Projection liegt das Projektionszentrum nicht direkt auf der z-Achse. Daher gibst du nicht nur Höhe und Breite an, sondern die Position der Clipplanes. Die Version mit Höhe und Breite ist einfach nur der Spezialfall, wo linke und rechte bzw. obere und untere Clipplane bei ± Breite bzw. Höhe liegen... ;)

Werbeanzeige