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

Aktuelle Zeit: Fr Jul 18, 2025 12:31

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mausposition auf Ebene projezieren
BeitragVerfasst: Mi Mai 21, 2008 18:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Hi,
bin gerade an dem Problem, wie ich die aktuelle Mausposition auf die xz-Ebene projeziere.
Wollte mal fragen, ob meine Idee soweit ok ist, oder ob die kompletter Blödsinn ist, da es noch viel einfacher ginge:
- Ich rechne die Mauskoordinaten um in OpenGL-Koordinaten mit gluUnProject, z=0
- Ich nehme den Richtungsvektor vom Augpunkt und Blickpunkt von den gluLookat-Parametern und bilde mit den Mauskoordinaten eine Gerade
- Diese Gerade lass ich mit der xz-Ebene schneiden.

Blödsinn, ja/nein?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 21, 2008 22:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Hm, das klappt soweit nicht, jemand eine Idee, warum?
Hier wäre der (Java-)Code...
Code:
  1.  
  2. private void projectTest(GL gl) {
  3.         int viewPort[] = new int[4];
  4.         double modelView[] = new double[16];
  5.         double projection[] = new double[16];
  6.         double result[] = new double[3];
  7.        
  8.         double z = 0.0;
  9.         int yNew;
  10.  
  11.         gl.glGetIntegerv(GL.GL_VIEWPORT, viewPort, 0);
  12.         gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelView, 0);
  13.         gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, projection, 0);
  14.        
  15.         yNew = viewPort[3] - mouse.y;
  16.        
  17.         glu.gluUnProject((double)mouse.x, yNew, z,
  18.                 modelView, 0,
  19.                 projection, 0,
  20.                 viewPort, 0,
  21.                 result, 0);
  22.         gl.glPushMatrix();
  23.        
  24.         Point3D eye = cam.getEye();
  25.         Point3D center = cam.getCenter();
  26.         Point3D dir = new Point3D(center.x - eye.x, center.y - eye.y, center.z - eye.z);
  27.        
  28.         /*
  29.          * 0 = result[1] + lambda * dir.y
  30.          * lambda = -result[1] / dir.y
  31.          */
  32.         double lambda = -result[1] / dir.y;
  33.         Point3D resXZ = new Point3D(result[0] + lambda * dir.x,
  34.                 /*result[1] + lambda * dir.y*/0.0f,
  35.                 result[2] + lambda * dir.z);
  36.  
  37.        
  38.         gl.glTranslated(resXZ.x, resXZ.y, resXZ.z);
  39.         gl.glDisable(GL.GL_LIGHTING);
  40.         gl.glDisable(GL.GL_TEXTURE_2D);
  41.         gl.glColor3f(1.0f, 0.0f, 0.0f);
  42.         UnitForms.drawUnitSphere(gl, 10);
  43.         gl.glEnable(GL.GL_LIGHTING);
  44.         gl.glEnable(GL.GL_TEXTURE_2D);
  45.         gl.glPopMatrix();
  46.     }
  47.  


UnitForms.drawUnitSphere() ist einfach eine Kapselung von gluSphere, ich will halt auf der Ebene eine Kugel zeichnen an der Koordinate, auf die der Mauszeiger zeigt.

//Edit: Klar, das geht wegen der Perspektive nicht, die Mauskoordinaten, die hier mit gluUnproject ermittelt werden, sind ja eben sehr sehr sehr nah an der Kamera...
Hat jemand einen neuen Ansatz? :)

//Edit2: Gelöst. So lala aber nur:
Ich zeichne die Ebene (Wird sie sowieso), fisch mir mit glReadPixels den Tiefenwert raus, eben wie es hier das Beispiel im Wiki macht. Das ist dann meine z-Komponente für gluUnproject. Somit krieg ich die Koordinaten auf der Ebene.
Unschön finde ich das, weil ich mit dieser Methode die Zeichenreihenfolge beachten muss... Erst die Ebene, dann das gluUnproject, dann den Rest auf der Ebene zeichnen. Bin also weiterhin für weitere Lösungen offen. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 22, 2008 08:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
gluUnproject einmal mit z=0 machen und dann mit z=1 und aus diesen beiden Punkten die Gerade bilden

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 22, 2008 08:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Ergänzung: also wenn ich deinen Quellcode überfliege, würde ich sagen, dass dein Richtungsvektor falsch ist. Ich habe das ganze mal grob schematisch im Anhang als Bild reingehängt. Der obere Teil ist World Space der untere Projection Space. Als Richtungsvektor nimmst du ja den Viewvektor (grün in meinem Bild), also das eye - center. Wenn ich das dann im Proj Space anschaue, siehst ja, was aus dem Vektor wird. Der Vektor muss aber im Proj Space "gerade" sein. Das erreichst du entweder mit meiner z=0/z=1 Variante (siehe drüber) oder du nimmst dein result - eye, das führt dann zum selben Vektor wie mit der z-Spielerei.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 22, 2008 12:21 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Code den ich in einem meiner Projekte verwende. Ich schneide allerdings mit der xy ebene

Einstellen der Perspektive und Vorbereitungen für die Bildschirm->Weltkoord rechnung
Code:
  1. procedure PrepareMainRender;
  2. var tmp:real;
  3. begin
  4.   //Perspektive einstellen
  5.   glEnable(GL_DEPTH_TEST);
  6.   MainRenderHeight:=Form1.ClientHeight-floor(Form1.ClientWidth*180/1024);
  7.   glViewport(0, ceil(Form1.ClientWidth*180/1024), Form1.ClientWidth, MainRenderHeight);
  8.   glMatrixMode(GL_PROJECTION);
  9.   glLoadIdentity;
  10.   gluPerspective(45.0,form1.clientwidth/MainRenderHeight , NearClipping, FarClipping);
  11.  
  12.   //Modelviewmatrix einstellen
  13.   glMatrixMode(GL_MODELVIEW);
  14.   glLoadIdentity;
  15.   glScalef(1,-1,1);
  16.   ViewAngle:=Game.me.ViewAngle;
  17.   glRotatef(ViewAngle,1,0,0);
  18.   glTranslatef( -game.me.scrollx, -game.me.scrolly-sin(ViewAngle*(pi/180))*Game.Me.Zoom, -Game.Me.Zoom*cos(ViewAngle*(pi/180)));
  19.   glGetfloatv(GL_MODELVIEW_MATRIX,@mat);
  20.   //Daten für ScreenToWorldBerechnen
  21.   invmat:=mat;
  22.   MatrixInvert(invmat);
  23.   ScreenDistance:=0.5*MainRenderHeight/tan(pi/8);
  24. end;


//Bildschirmkoords in Weltkoords umrechnen.
Code:
  1. procedure TranslateScreenToWorld(const sx,sy:integer;out wx,wy:real);
  2. var org,dir:TVector4f;//Origin&Direction
  3.     a:single;
  4. begin
  5.  if ScreenDistance=0 then exit;
  6.  org:=vectortransform(vector(0,0,0),invmat);
  7.  dir:=vectorsubtract(vectortransform(vector(sx-form1.clientwidth/2,sy-MainRenderHeight/2,ScreenDistance),invmat),org);
  8.  a:=org[2]/dir[2];
  9.  wx:=org[0]+a*dir[0];
  10.  wy:=org[1]-a*dir[1];
  11. end;

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 22, 2008 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Besten dank euch, werde das heute Abend einbauen. :) Dieses Ding mit z=0 und z=1 find ich schonmal viel besser als meine Variante.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 22, 2008 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Das mit der Z-Spielerei klappt wunderbar, besten dank. :)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.007s | 14 Queries | GZIP : On ]