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

Aktuelle Zeit: Fr Jul 18, 2025 16:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jul 09, 2007 14:27 
Offline
DGL Member

Registriert: Di Feb 06, 2007 15:33
Beiträge: 24
Hi,

ich schaue auf ein Objekt und kann es rotieren und verschieben. Solange ich nicht rotiert habe, stimmt der Translationsvektor mit meiner Mausbewegung überein. Nur wenn ich rotieren und dann verschiebe kann nach oben zu nach unten und so weiter werden...ist nicht schön und irgendwie fehlt mir grad ein pragmatischer Ansatz um herauszufinden, wie ich es denn am einfachsten meiner Mausbewegung entsprechend verschieben kann.

Hat da jemand einen Ansatz für mich?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 09, 2007 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Wenn du zuerst translatest und dann rotierst sollte das eigentlich stimmen mit der Mausbewegung.
D. h. der Translationsvektor bleibt dann gleich.
Irgendwie verstehe ich deine Frage aber nicht so recht... Willst du mit der Maus willst das Objekt nur in X- und Y-Richtung verschieben (zweidimensional) ?
Naja, es macht einen Unterschied, ob du a) erst rotierest dann translatest oder b) erst translatest und dann rotierst.
Wahrscheinlich rotierst du zuerst... Aber vllt habe ich deine Frage auch völlig fehl-interpretiert :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 10, 2007 06:42 
Offline
DGL Member

Registriert: Di Feb 06, 2007 15:33
Beiträge: 24
Vielleicht hab ich sie ja auch undeutlich gestellt ;) Also ich habe so etwas wie einen Viewer für 3D Objekte. Und da kann man nicht nur rotieren, sondern auch verschieben und zoomen. Und wenn man nun das Objekt sich so hindreht, wie man möchte und es dann verschiebt, kann es vorkommen, dass die Mausbewegung nicht mehr der Translation übereinstimmt.

Also ich weiß nicht, was gemacht wird. Aber ich weiß, dass beides funktionieren soll ;) Verstanden? Sonst erklär ich es nochmal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 10, 2007 07:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Es gibt eine Funktion namens gluUnProject. Damit kannst du eine Fensterposition in Abhängigkeit von der Tiefe in eine Objectposition berechnen. Bei einer Freien 3D Ansicht wird das natürlich nicht so einfach aber evtl genügt es ja. Kommt ja auch immer darauf an was du damit bezweckst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 10, 2007 08:01 
Offline
DGL Member

Registriert: Di Feb 06, 2007 15:33
Beiträge: 24
So etwas in der Art. Mal sehen, ob ich das hinbekomme.

Sinn des ganzen ist, dass man sich ein Objekt an jeder Stelle so anschauen kann, wie man es möchte. Sprich ich drehe es in die richtige Ansicht, verschiebe es, so dass ich auf einen bestimmten Bereich zoomen kann und kann mir dann meine "interessante Stelle" in Ruhe anschauen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 10, 2007 13:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Mir ist da gerade noch etwas eingefallen. Und zwar kommt das Problem in deinem ersten Beitrag nicht so wirklich gut rüber. Aber ich habe gerade eine verblüffend ähnlichen Beitrag in einem anderem Forum entdeckt und da kam diese Problemematik etwas besser rüber.

Sagen wir mal du betrachtes dein Object von Vorn und verschiebst es und alles ist Okay. Jetzt drehst du es um 180° und dann wird Links zu Rechts? Ich denke mal das ist richtig, wenn ich es jetzt richtig verstanden habe. Dieses Problem kannst du recht einfach durch Sinus und Cosinus beheben.

Die X Verschiebung wäre Sinus des Winkels * Verschiebung und die Z Verschiebung wäre Cosinus des Winkels * Verschiebung. Oder so etwas in der Richtung.

Warum das so ist ist recht einfach. Der Sinus von 0° ist 1. Der von 90° ist 0 und der von 180° ist -1. Wenn du als deine Ansicht um 180° gedreht hast würden alle X Verschiebungen zu negativen X Verschiebungen. So oder so ähnlich habe ich das auch schon mal gemacht. Weiß es allerdings nicht mehr 100%tig genau.

PS: Das gluUnproject bräuchtest du eher dann wenn du wirklich Pixelgenau verschieben möchtest. So hatte ich das laut deinem Beitrag auch verstanden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 11, 2007 06:26 
Offline
DGL Member

Registriert: Di Feb 06, 2007 15:33
Beiträge: 24
Ja so meine ich das. Das mit Sinus und Cosinus werde ich mal ausprobieren. Nur weiß ich derzeit leider nicht den Winkel um den ich gedreht habe (sonst wärs ja zu einfach ;) ). Ich habe nur 2 Vektoren mit denen ich arbeiten kann, verfolge aber gerade auch noch 1 anderen Gedankengang, in dem ich mir eine Plane drüberlege und den Vektor auf der Plane erzeuge und diesen dann umwandel.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 20, 2007 06:31 
Offline
DGL Member

Registriert: Di Feb 06, 2007 15:33
Beiträge: 24
So, nun hab ich auch dran gedacht Feedback zu geben. Die Lösung gestaltet sich etwas anders. Ich ermittle erst den rechtwinkligen Vektor zur Kamera und dann den rechtwinkligen zum rechtwinkligen. Damit habe ich die Ebene auf der ich verschieben möchte und kann meinen Vektor entsprechend anpassen.

Trotzdem vielen dank für die Tips!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 22, 2007 18:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 22, 2007 16:30
Beiträge: 17
hallo DerPeter

habe mich riesig gefreut als ich deinen beitrag gelesen habe.
zurzeit stehe ich nämlich vor exakt demselben problem.

leider hat mir das letzte feedback nicht weitergeholfen.

wäre es möglich, dass du den code postest, oder noch besser mir die source deines viewers mailst?

vielen dank
Q.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 23, 2007 08:35 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Du könntest auch das Objekt feststehend machen und die Kamera bewegen (gluLookAt). Diese Funktion will drei Parameter: Den Punkt, wo die Kamera ist (eye), den, wo sie hinschaut (center) und den, der nach 'oben' zeigt (für die Rotation um den Blickvektor- up). Jetzt kannst Du wenn die Kamera nur verschoben werden soll die beiden ersten Vektoren um den Bewegungsvektor verschieben, und das geht so:
erst ermittelst Du einen Vektor, der senkrecht auf eye->center und eye->up liegt (Kreuzprodukt): vx. Dieser wird um die Bewegung in x-Richtung skaliert. Danach ermittelst Du den Vektor, der senkrecht auf eye->center und dem neuen Vektor vx liegt: vy. Dieser wird um die Bewegung in y-Richtung skaliert. diese beiden werden addiert und auf eye und center addiert. Damit ist die Verschiebung der Kamera fertig.

Beim Rotieren ist es ähnlich, nur dass der Vektor eye->center rotiert wird (um die Mausbewqegungen in x- und y- Richtung) und entweder eye oder center neu berechnet wird. Wenn die Kamera um den Centerpunkt rotiert werden soll, rechnest Du eye mit dem neuen eye->center-Vektor aus, wenn die Kamera selber rotieren soll, dann wird center neu berechnet. Jetzt muss aber der up-Vektor angepasst werden. dies geschieht wie oben durch Kreuzproducht von eye->center mit up und anschließendem Kreuzprodukt des neuen Vektors mit eye->center um den neuen Up zu erreichen. Die Reihenfolge ist hier wichtig, da sonst Up mit falschem Vorzeichen rauskommt.
Soll sich die Kamera um Z rotieren, musst Du einfach Up rotieren.

Zoom brauchste nicht, denn das ist auch nix anderes, als eine Bewegung auf der Z-Achse, also entlang eye->center.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 23, 2007 14:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 22, 2007 16:30
Beiträge: 17
Toll.
Vielen Dank für den Tipp. Die Translation habe ich jetzt mal so implementiert und das läuft :D
mit der Rotation habe ich jetzt aber etwas Mühe.
So ausführlich wie Du antwortest klingts als hättest du ein Code-Schnippel davon :lol:
Könntest du das nicht posten?

(Wäre nicht auch eine Berechnung mit Hilfe der Kugelgl x^2+y^2+z^2=r^2 möglich?)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 23, 2007 14:48 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Hier der Code, wird Dir aber nicht gefallen, da ich damals meine eigene Vektorunit geschrieben habe, aber als Pseudocode sollte es die Gizmos in Gang bringen :lol:
Code:
  1.  
  2. Procedure TCamera.Rotate(_dForward,_dRight,_dUp: GLdouble);
  3. Var
  4.   oDirForward: TGLVector;
  5.   oMatForward: TGLMatrix;
  6.   oDirRight: TGLVector;
  7.   oMatRight: TGLMatrix;
  8.   oDirUp: TGLVector;
  9.   oMatUp: TGLMatrix;
  10.   oDirection: TGLVector;
  11. Begin
  12.   oDirection:=VecSub(oCenter,oEye);
  13.   oDirForward:=VecNormalize(oDirection);
  14.   oDirRight:=VecMultX(oDirForward,oUp);
  15.   oDirUp:=VecMultX(oDirRight,oDirForward);
  16.   If _dForward<>0
  17.   Then Begin
  18.     oMatForward:=VecToRotationMatrix(oDirForward,_dForward);
  19.     oDirection:=vecMult(oDirection,oMatForward);
  20.   End;
  21.   If _dRight<>0
  22.   Then Begin
  23.     oMatRight:=VecToRotationMatrix(oDirRight,_dRight);
  24.     oDirection:=vecMult(oDirection,oMatRight);
  25.   End;
  26.   If _dUp<>0
  27.   Then begin
  28.     oMatUp:=VecToRotationMatrix(oDirUp,_dUp);
  29.     oDirection:=vecMult(oDirection,oMatUp);
  30.   End;
  31.   oCenter:=vecAdd(oEye,oDirection);
  32. //  oUp:=oDirUp;
  33. End;
  34.  

In der letzten Zeile siehst Du, dass in meinem Falle sich die Kamera um sich selber dreht. Wenns anderst gewünscht wird, musst Du Center belassen und Eye mit der neuen Richtung verwurschteln (hier müssen dann aber ggf die Vorzeichen von den Übergabeparametern gedreht werden). Alle nicht lokal deklarierten Variablen sind Member meiner Camera-Klasse, die Rotationen sind in Bogenmaß um die jeweilige Achse anzugeben.

p.s.: hier noch die Funktion VecToRotationMatrix:
Code:
  1. //______________________________________________________________________________
  2. Function VecToRotationMatrix(_oAxis: TGLVector;
  3.                              _dRotation: GLDouble): TGLMatrix;
  4. Var
  5.   c: Double;
  6.   s: Double;
  7. Begin
  8.   c:=cos(_dRotation);
  9.   s:=sin(_dRotation);
  10.   Result.M[0,0]:=c + (1-c)*sqr(_oAxis.X);
  11.   Result.M[0,1]:=(1-c)*_oAxis.X*_oAxis.Y + s*_oAxis.Z;
  12.   Result.M[0,2]:=(1-c)*_oAxis.Z*_oAxis.X - s*_oAxis.Y;
  13.   Result.M[0,3]:=0;
  14.  
  15.   Result.M[1,0]:=(1-c)*_oAxis.X*_oAxis.Y - s*_oAxis.Z;
  16.   Result.M[1,1]:=c + (1-c)*sqr(_oAxis.Y);
  17.   Result.M[1,2]:=(1-c)*_oAxis.Y*_oAxis.Z + s*_oAxis.X;
  18.   Result.M[1,3]:=0;
  19.  
  20.   Result.M[2,0]:=(1-c)*_oAxis.Z*_oAxis.X + s*_oAxis.Y;
  21.   Result.M[2,1]:=(1-c)*_oAxis.Y*_oAxis.Z - s*_oAxis.X;
  22.   Result.M[2,2]:=c + (1-c)*sqr(_oAxis.Z);
  23.   Result.M[2,3]:=0;
  24.  
  25.   Result.M[3,0]:=0;
  26.   Result.M[3,1]:=0;
  27.   Result.M[3,2]:=0;
  28.   Result.M[3,3]:=1;
  29. End;
  30.  

... und nochn paar Typen zum Verständnis.
Code:
  1.   TGLMatrix=Record
  2.     Case Boolean of
  3.       True: (A: Array[0..15] of GLDouble);
  4.       False: (M: Array[0..3,0..3] of GLDouble);
  5.     // ATTENTION OpenGL stores Column-leading
  6.     // first index is Column, second is Row
  7.     // e.g.: 1st col, 3rd row would be [0,2] not [2,0]
  8.   End;
  9.   TGLVector=Record
  10.    Case Integer Of
  11.     0: (X: GLDouble;
  12.         Y: GLDouble;
  13.         Z: GLDouble);
  14.     1: (Width: GLDouble;
  15.         Depth: GLDouble;                                    
  16.         Height: GLDouble);
  17.     2: (Tilt: GLDouble;
  18.         Roll: GLDouble;
  19.         Pan: GLDouble);
  20.   End;
  21.  

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 23, 2007 15:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 22, 2007 16:30
Beiträge: 17
ach so: alles in pascal - mache die sache eben in c++

egal! vielen dank für diene Hilfe mittlerweile gehts langsam voran und ich sehe, dass ich um eine eigene math-klasse nicht herumzukomme :arrow:
also los...

mathe mag ich ja :shock:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Hallo, ich habe auch eine Idee
BeitragVerfasst: Mi Sep 19, 2007 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 09, 2005 13:48
Beiträge: 117
Wohnort: Sankt Augustin
Seht doch mal unter "Nützliche Helfer" nach. Da gibt es ein Beispielprogramm und den kompletten Sourcecode dazu ... (Kamera)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 19, 2007 15:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 22, 2007 16:30
Beiträge: 17
Besten Dank für den Tipp!
werde mir das heute abend mal genauer anschauen :arrow: :arrow: :arrow:

:shock:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]