Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 23:47

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mausklick Schnittpunkt
BeitragVerfasst: Di Feb 19, 2013 02:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hallo allerseits,

Ich bin mal wieder am verzweifeln. :/
Ich will das wenn ich an einen Ort klicke, ein Objekt an diesem Punkt erscheint, so wie in einem Leveleditor.

Das funktioniert prima, solange ich die Kamera nicht drehe, bzw. nur geringfügig drehe. Die Objekte erscheinen wie geplant auf der xz-Ebene. Sobald ich aber Anfang mich um 90° nach links oder nach recht zu drehen, passiert folgendes: Wenn ich an einen Punkt klicke erscheint der Busch nicht dort, aber in der gleichen xz-Richtung nur mit größerer Entfernung weiter hin. Den folgenden Code verwende ich für die Positionierung des Objektes.

Code:
  1. procedure TestClick(X, Y: Integer);
  2. var ParX, ParY: double; Projection, Rotation, pVX, pVY, pVZ, FinalPosition: TMeleePosition; Perspective: TMeleeMatrix; ViewVector: TMeleePosition; i: integer;
  3. begin
  4.   glMatrixMode(GL_PROJECTION);
  5.   glLoadIdentity;
  6.   gluPerspective(45.0, 1920/1080, 0.01, 10000);
  7.   glMatrixMode(GL_MODELVIEW); // Modellmatrix laden, da diese als default aktiviert sein soll.
  8. Projection := MyCamera.ExportPerspectiveToXYZ(); // Läd den X,X-Wert der Projektions Matrix in Projection.X und den Y,Y-Wert der Projektions Matrix in Projection.Y
  9. Perspective := MyCamera.ExportToMatrix(); // Lädt die Modelview Matrix der Camera in Perspective.
  10. Rotation := MyCamera.Rotation; // unwichtig, hab ich zu Test-Zwecken eingebaut und entferne ich am Ende wieder.
  11. pVX := meGetXVector(Perspective); // 0. Spalte (X-Achse) der Modelview Matrix in X-Achsen Vektor einlesen.
  12. pVY := meGetYVector(Perspective); // 1. Spalte (Y-Achse) der Modelview Matrix in X-Achsen Vektor einlesen.
  13. pVZ := meGetZVector(Perspective); // 2. Spalte (Z-Achse) der Modelview Matrix in X-Achsen Vektor einlesen.
  14. ParX := (X / 960 - 1); // Hier rechne ich aus, wie viel % des X-Vektors an den Z Vektor angehängt werden müssen damit dem angeklickten Punkt entspricht.
  15. ParY := -(Y / 540 - 1); // X, Y sind hierbei die auf dem Bildschirm angeklickten Koordinanten, von oben, links. Daher auch das Minus vor dem Y.
  16. ViewVector := meCalculate(PVZ, me_Add, meCalculate(
  17. meCalculate(PVX, me_Multiply, ParX / Projection.X),
  18. me_Add,
  19. meCalculate(PVY, me_Multiply, ParY / Projection.Y)));
  20. // Hier passiert letztendlich nur das die Vektoren PVZ, PVY, PVX nach folgender Formel zum Angeklickten Richtungsvektor addiert werden.
  21. // 1 * PVZ + (ParX / Projection.X) * PVX + (ParY / Projection.Y) * PVY
  22. // erst der komplette Z-Vektor, dann je nachdem wie weit man nach rechts geklickt hat der ParX Wert multipliziert mit dem X-Wert aus der Projektionsmatrix und das selbe mit dem y-Vektor.
  23.  
  24.  
  25. ViewVector := meNormalize(ViewVector); // Brauch man eigentlich nicht aber beim Testen hab ich es einfach mal eingebaut.
  26. // Ab hier dann einfach Schnittpunkte Gerade mit Ebene (z = 0).
  27. FinalPosition.Y := 0; // Schnittpunkt mit der X-Z Ebene ermitteln, wobei (-MyCamera.Position.Y / ViewVector.Y) dem Vielfachen des Vektors entspricht um Y = 0 zu erfüllen.
  28. FinalPosition.X := MyCamera.Position.X + (-MyCamera.Position.Y / ViewVector.Y) * ViewVector.X ;
  29. FinalPosition.Z := MyCamera.Position.Z - (-MyCamera.Position.y / ViewVector.y) * ViewVector.Z;
  30. i := random(length(MyPosArray)); // Zu Testzwecken habe ich bereits Objekte und positioniere nur ein zufälliges von ihnen, am Zielpunkt.
  31. MyPosArray[i].X := FinalPosition.X; // Nicht wundern, dass hier Y fehlt, das bleibt standardmäßig auf Null.
  32. MyPosArray[i].Y := FinalPosition.Z;
  33. end;


Wie bereits gesagt, sobald ich die Kamera um mehr nach 90° nach links oder rechts drehe kommen, werden die Objekte weiter weg als mein eigentlicher Mausklick gesetzt.
Wenn ihr mir irgendwie helfen könntet wäre ich sehr dankbar. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mausklick Schnittpunkt
BeitragVerfasst: Di Feb 19, 2013 03:00 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Eine Stelle wundert mich (bin kein Mathegenie :D)
Code:
  1. MyPosArray[i].Y := FinalPosition.Z;
müsste hier nicht
Code:
  1. MyPosArray[i].Z := FinalPosition.Z;
stehen, da wie du ja selbst sagst Y standartmäßig auf 0 bleibt?

Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mausklick Schnittpunkt
BeitragVerfasst: Di Feb 19, 2013 12:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
MyPosArray is ein Array vom Record TMeleeCoord (mit X, Y als Werte)
Sie beschreiben den Punkt auf der Karte (die ja natürlich nur 2 dimensional ist.)

Nachher im Draw Befehl steht nämlich folgendes, weswegen das mit dem Y := Z ok ist.
Code:
  1. glScalef(3,3,3);
  2. for i := 0 To High(MyPosArray) do
  3.   begin
  4.   glPushMatrix();
  5.   glTranslatef(MyPosArray[i].X/3, 0, MyPosArray[i].Y/3);
  6.   MyStatic.Render();
  7.   glPopMatrix();
  8.   end;


Ein Frage stimmt die GetVector Funktion so?
Code:
  1. function meGetXVector(const iMatrix: TMeleeMatrix): TMeleePosition;
  2. begin
  3. result.X := iMatrix[0];
  4. result.Y := iMatrix[1];
  5. result.Z := iMatrix[2];
  6. end;
  7.  
  8. function meGetYVector(const iMatrix: TMeleeMatrix): TMeleePosition;
  9. begin
  10. result.X := iMatrix[4];
  11. result.Y := iMatrix[5];
  12. result.Z := iMatrix[6];
  13. end;
  14.  
  15. function meGetZVector(const iMatrix: TMeleeMatrix): TMeleePosition;
  16. begin
  17. result.X := iMatrix[8];
  18. result.Y := iMatrix[9];
  19. result.Z := iMatrix[10];
  20. end;


EDIT: Mir ist letztendhin etwas komischen aufgefallen: Obwohl ich die Kamera nur um die y und x-Achse drehe ist trotzdem der Y-Wert des X-Achsen Vektors nicht 0 noch annähernd 0?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mausklick Schnittpunkt
BeitragVerfasst: Di Feb 19, 2013 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Der folgende Link sollte dir weiterhelfen:

http://www.opengl.org/wiki/GluProject_a ... oject_code

einfach unproject mit den Werten von
Code:
  1.  
  2. glGetIntegerv(GL_VIEWPORT, viewport);
  3. glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
  4. glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
  5.  


aufrufen dann kriegst du den Richtungsvektor....

alternativ kannst du natuerlich auch die project funktion nehmen um deine Geometrie nach 2D zu projezieren (funzt aber in diesen Beispiel nicht fuer Ortho)

unproject duerfte aber am leichtesten sein, da die meisten Projekte sowieso tracing fuer Kollision schon haben.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mausklick Schnittpunkt
BeitragVerfasst: Mi Feb 20, 2013 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Hat funktioniert, ich musste nur vorher die Tranformation der Kamera rückgängig machen bzw. Hab einfach Matrix[12, 13, 14] = 0 gesetzt, weil ja Unproject bereits die Position der Kamera in die Berechnung mit einbezieht. Hab für WinZ einfach 0.5 ingesetzt.

Mein Code falls jemanden interessiert:

Code:
  1. procedure Click(X, Y: integer);
  2. var Perspective, Projection: TGLMatrixd4; Viewport: TGLVectori4;
  3.     ViewVectorD: TSpecificPosition; ViewVector, FinalPosition: TMeleePosition;
  4.     i: integer; QX, QY, QZ: TGLdouble;
  5. begin
  6. glGetDoublev(GL_MODELVIEW_MATRIX, @Perspective);
  7. glGetDoublev(GL_PROJECTION_MATRIX, @Projection);
  8. glGetIntegerv(GL_VIEWPORT, @Viewport);
  9.  
  10. if gluUnproject(X, 1080 - Y, 0.5, Perspective, Projection, Viewport, @QX, @QY, @QZ) = GL_FALSE then showmessage('GLU Unproject Error.');
  11. ViewVector := meSetPosition(QX, QY, QZ);
  12.  
  13. FinalPosition.Y := 0;
  14. FinalPosition.X := MyCamera.Position.X + (-MyCamera.Position.Y / ViewVector.Y) * ViewVector.X;
  15. FinalPosition.Z := MyCamera.Position.Z + (-MyCamera.Position.y / ViewVector.y) * ViewVector.Z;
  16. end;


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 15 Queries | GZIP : On ]