Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Linie zeichen OpenGL (https://www.delphipraxis.net/113957-linie-zeichen-opengl.html)

EWeiss 17. Mai 2008 09:45


Linie zeichen OpenGL
 
Ich verwende das gluUnProject um die koordinaten der Mausposition ins OpenGl Format umrechnen zu lassen.

jetzt möchte ich zum testen der Position vier Linien zeichnen
die von den 4 Ecken des GLWindow ausgehen und sich an der Mausposition treffen sollen.

Jemand ne Idee ? Wie ich die zeichnen kann.

Möchte damit testen ob die Mausposition passend zum OpenGl Window ist.
Irgendwas scheint nicht zu stimmen.

Delphi-Quellcode:
vLine[1] := MousePosToOpenGl(FMousePos.X, FMousePos.Y);
 
glBegin(GL_LINES);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glEnd();
wie vLine[1] an glVertex2f übergeben ?

vLine[1] enthält ja 3 positionen vLine[1][0], vLine[1]{1], vLine[1][2]
benötige aber nur 2

Das wäre nur 1 Linie

gruss Emil

mkinzler 17. Mai 2008 09:58

Re: Linie zeichen OpenGL
 
Die z Koordinate ist ja in deinem Fall uninteressant.

EWeiss 17. Mai 2008 10:06

Re: Linie zeichen OpenGL
 
Zitat:

Zitat von mkinzler
Die z Koordinate ist ja in deinem Fall uninteressant.

Jo das stimmt ..
Bringt mich aber nicht weiter ;)
kann da eingeben was ich will ist aber nur rätzelraten.

hmmm....

gruss Emil

Der_Unwissende 17. Mai 2008 10:16

Re: Linie zeichen OpenGL
 
Zitat:

Zitat von EWeiss
Bringt mich aber nicht weiter ;)
kann da eingeben was ich will ist aber nur rätzelraten.

hmmm....

Hi,
sorry aber wen soll das jetzt weiter bringen? Du stellst eine Frage und bekommst doch eine gute Antwort (dass eben die drei Koordinaten x, y und z sind und Du natürlich nur x und y übergeben musst).
Wie genau bringt es Dich denn nicht weiter, was hast Du eingegeben und was passiert dabei? Oder sollen die Leute, die Dir helfen sollen jetzt rätselraten?

Hast Du denn überhaupt mal (ganz ohne Maus) erfolgreich eine Linie zeichnen können, die Du gut siehst? Zeichne doch einfach mal eine solche als Winkelhalbierende durch Dein OpenGL - Fenster. Dann kennst Du ja die Koordinaten der Linie. Nun kannst Du einfach mal mit der Maus über diese Linie fahren und schauen, ob die berechnete (OpenGL) Position des Mauszeigers auch tatsächlich auf der OpenGL-Linie liegt.
Wenn das stimmt, dann kannst Du natürlich leicht das Programm so umwandeln, dass Du auch Linien ziehst.

Gruß,
Der Unwissende

EWeiss 17. Mai 2008 10:31

Re: Linie zeichen OpenGL
 
Zitat:

sorry aber wen soll das jetzt weiter bringen? Du stellst eine Frage und bekommst doch eine gute Antwort (dass eben die drei Koordinaten x, y und z sind und Du natürlich nur x und y übergeben musst).
Wie genau bringt es Dich denn nicht weiter, was hast Du eingegeben und was passiert dabei? Oder sollen die Leute, die Dir helfen sollen jetzt rätselraten?
Habe verstanden was mkinzler mir damit sagen wollte.
raten mußt du nix ..

aber Z brauch ich trotzdem da ich die kameraposition mit berücksichtigen muss.
so einfach ist es also doch nicht.

hab es schon gelößt

trotzdem Danke

gruss Emil

idontwantaname 17. Mai 2008 10:53

Re: Linie zeichen OpenGL
 
Hi!

Ich kenn mich zwar nur mit DirectX aus, aber 3D-Mathematik bleibt 3D-Mathematik ;) Irgendwie verstehe ich deinen Code nicht ganz.

Du errechnest dir aus deiner Mausposition ein Array mit 3 Werten x, y und z. Du nimmst an, das ist ein Punkt, was jedoch nicht sein kann, denn an der Stelle der Maus können sich unendlich viele Punkte im Raum befinden. Sprich, du kannst dir höchstens einen Strahl ausrechnen, eine Gerade, deren Punkte auf den Bildschirm an die Mausposition projiziert werden.

Warum benötigst du nur 2 Koordinaten? Es scheint so, als ob du nicht im 3D-Raum zeichnest, sondern in 2D. Welchen Sinn macht es, die Mauskoordinaten in den dreidimensionalen Raum umzurechnen, wenn du zweidimensionale Linien zeichnest? Die x/y-Werte der Mausposition entsprechen doch schon den Koordinaten auf der 2D-Bildfläche (höchstens dass OpenGL in einem Intervall von [0,1] rechnet und du das noch berücksichtigen musst).

Und zu guter letzt wäre es noch nett, deinen Lösungsweg hier zu beschreiben. Jemand anderer, der eventuell das selbe Problem hat, kann dann von deiner Vorarbeit profitieren. Ansonsten ist dieser Thread relativ unnötig, da zwar das Problem, nicht aber die Lösung präsentiert wird.

Lg oli

mkinzler 17. Mai 2008 11:01

Re: Linie zeichen OpenGL
 
Dan übergebe doch alle x, y, z statt nur x, y

EWeiss 17. Mai 2008 11:11

Re: Linie zeichen OpenGL
 
Mein problem ist dies.
Ich versuche ein objekt zu identifizieren auf dem ich eine aktion ausführen kann wenn denn mal gefunden.

Dafür benutze ich

Delphi-Quellcode:
      if IntersectedPolygonf(vQuad, vLine, 4 , nil) then
      begin
        glColor3f(1.0, 0.0, 0.0);
        // Dieses Quad liegt unter der Maus
      end
Das mit der Linie habe ich verworfen und benutze zum testen lediglich eine Farbe die sich verändert
wenn das Objekt getroffen wird.

Es wird aber nicht getroffen .. deshalb mein ansatz mit dem zeichnen der Linien
was aber nicht geht da ich mehrere Viewports auf der Oberfläsche habe.


Delphi-Quellcode:
  // Kamera ausrichten, damit man was sieht
  glTranslatef(0, -7, -30);

  // Maus verarbeiten
  if FMousePos.X > 0 then
  begin
  if FMousePos.X < 50 then
     ListAngle := ListAngle - pi/4 * ADeltaTime
  else
  if FMousePos.X > _FNormal.Image1.Width - 50 then
     ListAngle := ListAngle + pi/4 * ADeltaTime;
  end;

  vLine[0] := Vector_Make3f(0, 7, 30); // die von glTanslate, nur mal -1
  vLine[1] := MousePosToOpenGl(FMousePos.X, FMousePos.Y);
Diese abfrage MousePosToOpenGl sollte mir eigentlich die korrekte position der Maus zum OpenGL Window zurückgeben
was sie aber nicht tut.
Finde einfache den Fehler nicht.

Deshalb meine überlegung das mal gegenzuprüfen mit einer Linie
welche von der oberen linken ecke zur aktuellen Mausposition gezogen wird damit ich sehen kann ob das Objekt getroffen wird.

Aber leider geht das mit der aktuellen Kameraposition nicht.

Zitat:

Dan übergebe doch alle x, y, z statt nur x, y
habe ich;)
über glVertex3f

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf