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

KahnSoft

Frischling

  • »KahnSoft« ist der Autor dieses Themas

Beiträge: 59

Wohnort: Berlin

  • Private Nachricht senden

1

16.07.2018, 01:39

Mauspos aus der 3D-Scene

Hallo zusammen,

ich erlange über die Maus in der OpenGL -Scene die dazu passenden 3D xyz Koordinaten via gluProject.
Leider sind die Ergebnisse immer dann ungenau, wenn sich unter Maus das Netz uneben darstellt.

Gibt es Hinweise wie man die Situation der besten 3D -Ordinate aus der Mausposition gewinnt, oder
ist hier schon ein Fehler abzusehen ?

Vielen Dank für Hinweise- Erklärvideo dazu : https://youtu.be/jfWM6e0R0mk



(Link)


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
CVertex CGLfrustum::ScreenToVertex(CVertex vertex, const CVertex depthvert, bool usedepth)
{
    double x, y, z;
    double proj[17];   glGetDoublev(GL_PROJECTION_MATRIX, &proj[0]);
    double mode[17];   glGetDoublev(GL_MODELVIEW_MATRIX, &mode[0]);
    int viewport[5];   glGetIntegerv(GL_VIEWPORT, &viewport[0]);

    //vertex.x = m_viewport[2] - vertex.x; 
    vertex.y = m_viewport[3] - vertex.y; // In OpenGL steigt Y von unten (0) nach oben

    if (usedepth)//get the depth from given Vertex :-)
        gluProject(depthvert.x, depthvert.y, depthvert.z, &mode[0], &proj[0], &m_viewport[0], &x, &y, &z), vertex.z = z;
    else //get the depth from given Mouse :-(
        glReadPixels(vertex.x, vertex.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &vertex.z);

    //if(vertex.z == 1)
    // vertex.z=z;
    // TRACE("Depth Glu(%f) Pix(%f)\r\n",z, vertex.z);

    gluUnProject(vertex.x, vertex.y, vertex.z, &mode[0], &proj[0], &viewport[0], &x, &y, &z);

    return CVertex(x, y, z);
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.07.2018, 05:20

Zu einer 2D-Position gibt es unendlich viele passende 3D-Positionen, die allesamt auf einem Strahl liegen. Diesen Strahl (Ursprung in der Kamera, Richtung ermittelt man anhand der 2D-Position) schneidet man mit der Geometrie der Szene und erhält dann die passende 3D-Position. Also 3D-Position = Schnittpunkt des Strahls mit der 3D-Geometrie der Szene.
Dieser Strahl wird oft auch als „Picking Ray“ bezeichnet. Wenn du danach bei Google suchst, insbesondere in Verbindung mit OpenGL, wirst du eine Menge Informationen dazu finden.
Wenn du die Möglichkeit hast, auf den Z-Buffer zuzugreifen, geht das ganze auch ohne Schneiden des Strahls, dann nimmst du die Tiefe von dort.

KahnSoft

Frischling

  • »KahnSoft« ist der Autor dieses Themas

Beiträge: 59

Wohnort: Berlin

  • Private Nachricht senden

3

16.07.2018, 13:09

Danke,

genau da muss ich noch mal sehen, es ist immer die Z-Ebene die zu stören scheint.
Das heißt die Positionsbestimmung mit der Maus geht bei mir nur gut, wenn die Ebene auf der
sich die Maus bewegt planar ist, ich rendere eine Groundplane, danach kann ich die Position
erlangen , eigentlich brauche ich somit 2 Positionen eine von der Ebene , und eine Weitere für die Objekte die später über dieser Ebene liegen, dann aber diese nicht mehr genau wiedergeben kann .

Also zwischen den Render -Durchgängen , mehrmals Project Glu auslösen.


Vielen Dank für den Hinweise
Karsten

Werbeanzeige