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

Powerpaule

Treue Seele

  • »Powerpaule« ist der Autor dieses Themas

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

1

27.03.2008, 14:33

[OpenGL] Mausposition im Raum

Also ich habe eine Welt mit einer Ebene und ein paar Bäumen drauf.
Nun will ich herausfinden, auf welchen Punkt auf der Ebene mit der Maus gezeigt wird.

Mein bisheriger Code sieht so aus:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void CGame::Mouse()
{        
        float Z;

        SVektor P1,P2,V;    // Erster Punkt, Zweiter Punkt, Verbindungsvektor


        GLint Viewport[4];
        GLdouble Modelview[16];
        GLdouble Projection[16];
        int X = g_pFramework->GetMouseC().x;  //X-Koordinate der Maus

        int Y = g_pFramework->GetMouseC().y;  //Y-Koordinate der Maus


        glGetDoublev(GL_MODELVIEW_MATRIX, Modelview);

        glGetDoublev(GL_PROJECTION_MATRIX, Projection);

        glGetIntegerv(GL_VIEWPORT, Viewport);

        //glReadPixels(X,Y,1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &Z);


        gluUnProject(X,Y,0.0,Modelview,Projection,Viewport,&P1.x,&P1.y,&P1.z); //Punkt auf für z=0 ermitteln


        gluUnProject(X,Y,1.0,Modelview,Projection,Viewport,&P2.x,&P2.y,&P2.z); //Punkt für z=1 ermitteln



// Verbindungsvektor zwischen beiden erstellen (=Richtungsvektor des "Mausstrahls")

        V.x = P1.x - P2.x;
        V.y = P1.y - P2.y;
        V.z = P1.z - P2.z;

        if(g_pFramework->g_pKeyUp[83])
        {
                ShowMessage("(" + FloatToStr(V.x) + " | " + FloatToStr(V.y) + " | " + FloatToStr(V.z) + ")");
        }

        if(V.y != 0)
        {
                //Schnittpunkt mit der Ebene berechnen (Ebene liegt bei y=0), RPos = Position der Kamera

                MausPos.x = -RPos.x - (RPos.y * V.x) / V.y;
                MausPos.z = -RPos.z - (RPos.y * V.z) / V.y;
        }

}


Wenn ich die Kamera nun nicht drehe oder nur um die y-Achse drehe, funktiert das auch einwandfrei, drehe ich sie nun aber um die x-achse, verschiebt sich der Punkt immer stärker, vor allem in Richtung der Z-Achse!

Woran kann das liegen?
danke schonmal!


Edit:
Damit ihr euch das besser vorstellen könnt, hab ich hier mal 2 Screenshots. Die gelbe Kugel soll eigentlich an der Position sein, auf die man mit der Maus zeigt. Die Position des Mauszeigers hab ich mal durch ein weißes Kreuz angedeutet.

1. Bild: Hier klappts prima, Die Kamera wurde um 77° um die y-Achse gedreht:

(Link)


2. Bild: Hier verschiebt sich die Kugel falsch, die Kamera ist um 10° um die x-Achse gedreht:

(Link)

2

27.03.2008, 17:40

Evtl. hast du einen Fehler bei PicRay/Ebene Schnittpunkt. Das hatte ich mal. Naja, bei mir ist der Code für Strahl/Ebene auch dezent länger, vielleicht hab ich etwas nicht optimiert oder du hast eine zu simple Formel die nicht für alle Fälle gilt.
Lieber dumm fragen, als dumm bleiben!

Powerpaule

Treue Seele

  • »Powerpaule« ist der Autor dieses Themas

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

3

27.03.2008, 18:02

oh, danke für den Tipp, daran hab ich garnicht mehr gedacht - die Formel stimmt aber, nur muss ich die Koordinatenwerte der Kamera durch den entgegensetzten Wert ersetzen... jetzt klappt alles :)

4

27.03.2008, 18:03

Ja, wenn man die Kamera (die es gar nicht gibt) nach links dreht, dreht sich eigentlich die Welt nach rechts.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige