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

Aktuelle Zeit: Fr Jul 18, 2025 08:43

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: GPS Sim - Drehen um Mittelpunkt
BeitragVerfasst: Fr Apr 15, 2005 10:41 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 10:30
Beiträge: 28
Moin !

So, ich progge jetzt seit ein paar Tagen OpenGL, weil mich Phobeus dazu getrieben hat :D Aber ich muss sagen das ich schon beeindruckt bin. Und ich habe auch schon Erfolge erzielt.
Ich progge gerade an einer GPS Visualisierung. Man läd eine NMEA Datei und das Prog zeigt die aufgezeichnete GPS Strecke als 3D Objekt. Das ist eigentlich nix wildes, aber seis drum :wink:

Ich bin mitlwerweile soweit, dass ich das Objekt zusammensetze und anzeige. Auch eine einfache Rotation über 3 Timer habe ich schon realisiert. Soweit so gut.
Was ich nicht in den Griff kriege ist die Rotation um den Mittelpunkt des Objekts. Ich habe keinen Schimmer wie ich das machen soll. Das ist mein Quellcode

Code:
  1.   glTranslatef(-1,0, (Scrollbar1.Position / 10));
  2.   glRotatef(Scrollbar2.Position, 1, 0, 0);
  3.   glRotatef(Scrollbar3.Position, 0, 1, 0);
  4.   glRotatef(Scrollbar4.Position, 0, 0, 1);
  5.   glScaled((ScrollBar5.Position / 10),(ScrollBar5.Position / 10),(ScrollBar5.Position / 10));
  6.   glBegin(GL_LINE_STRIP);
  7.   //glVertex3f(X, Y, Z);
  8.     // X = Longitude (E)
  9.     // Y = Höhe      (Altitude)
  10.     // Z = Latitude  (N)
  11.     for _i := 1 to 6600 do begin
  12.       glColor3f(0,0,1);
  13.       glVertex3f(x[_i], y[_i], z[_i]);
  14.     end;
  15.   glEnd();


Scrollbar1 setzt quasi die Entfernung, Scrollbar 2-4 die Rotation, Scrollbar5 den Scalfaktor (von 0.1 -10).

Also, Frage halt ...
Wie kriege ich es hin, das ich das Objekt um seinen Mittelpunkt rotieren lassen kann? Und ich würde gerne vom Mittelpunkt aus einen Zoom auf oder von dem Objekt machen.

Könnte mir da einer weiterhelfen?

_________________
Greetz Moelski


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 15, 2005 11:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Ich mache das immer so (stark vereinfachter / verkürzter code):

1. Entvernung der Kamera von ihrem Fokus:
Code:
  1.   gltranslatef(0,0,-Distance);

2. rotationsbefehle für die kamera:
Code:
  1.   glrotatef(Direction.z,0,0,-1);
  2.   glrotatef(Direction.y,0,-1,0);
  3.   glrotatef(Direction.x,-1,0,0);

3. verschiebung des Kamerafokus:
Code:
  1.   gltranslatef(-Position.x,-Position.y,-Position.z);

4. schleife für die objekte:
Code:
  1.   for i := 1 to objectnumber do begin
  2.     glPushMatrix;

5,6,7. Verschieben des Models / Rotieren des models / Skalieren des models:
Code:
  1.     gltranslatef(Model[i].Position.x,Model[i].Position.y,Model[i].Position.z);
  2.     glrotatef(Model[i].Direction.x,1,0,0);
  3.     glrotatef(Model[i].Direction.y,0,1,0);
  4.     glrotatef(Model[i].Direction.z,0,0,1);
  5.     glscalef(Model[i].Scale,Model[i].Scale,Model[i].Scale);

8. Zeichnen:
Code:
  1.     Model[i].draw;

9. schleife zuende :-)
Code:
  1.     glPopMatrix;
  2.   end;


Hilft das???

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 15, 2005 11:49 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 10:30
Beiträge: 28
Moin !

Da das sieht schon gut aus. Wenn du mir jetzt noch sagst was du bei den Variablen alles übergibst und wie Model[i] aufgebaut ist, dann wäre ich glucklitsch :D

_________________
Greetz Moelski


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 15, 2005 14:55 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 10:30
Beiträge: 28
Moin!

Hat denn hier wirklich keiner mehr eine Info?!

Wo sind den die ganzen Gurus :roll: :?:

_________________
Greetz Moelski


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 15, 2005 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 24, 2003 18:19
Beiträge: 165
Wohnort: Cologne
ich dachte die ganzen gurus sind nur nachtaktiv ;)

however, eigentlich ist schon alles gesagt. was du über Model[i] wissen musst, steht eigentlich im source. du benötigst den mittelpunkt der ganzen vertices, den du relativ leicht ausrechnen kannst (niedrigste & höchste werte für x,y,z finden, differenz=mittelpunkt). am besten ziehst du diesen mittelwert-vektor von den vertices beim startup (nach dem ausrechnen :D) ab, damit das objekt seine mitte im ursprung hat.

und beim zeichnen einfach das machen:

glPushMatrix();
glTranslatef(MittelPunktsvektor);
glRotatef(wie du rotieren willst)

... // zeichnen

glPopmatrix()

... das sollte es tun :) die idee, gps daten zur visualisierung zu nutzen finde ich übrigens gut, mach daraus ein rennspiel, ich wollt schon immer mal meine üblichen fahrwege virtuell abfahren... :D

_________________
www.omfg.biz - aktuelles projekt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 15, 2005 22:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hab mal von nem Kumpel gehört der bei Landvermessern ähnliches machen sollte, das dann aber anscheinend nich gemacht hat. OpenGL ist definitiv ne feine Lösung um sowas anzuzeigen.

Mal als Erklärung wieso das bisher mit der Rotation net funktioniert hat:

OpenGL dreht immer um den KOU (0,0,0). Dein Modell liegt aber nicht dort. Deshalb musst du das Zentrum deines Modells per glTranslate zuerst in den Nullpunkt verschieben. Dann kannst du es drehn und wenns nötig ist weiter bearbeiten (z.B. Scalieren).

Denk beim Skalieren aber daran, dass danach alle OpenGL mße skaliert sind. Ein glTranslate(1,0,0) nach einem glScalef(20,1,1) schiebt nicht eine sondern 20 Einheiten weit!....;)
(Um die wirkung der Scalierung rückgängig zumachen musst du neu scalieren. Ein glScale(1,1,1) hilft NICHT! Du musst mit dem reziproken scalieren (1/20,1,1). Also nur so am Rande, solltest du mal an so ne Stelle kommen....;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 16, 2005 13:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Naja, meine Kamera hat folgende variablen:

Code:
  1.   TGraEngineCamera = object
  2.     ...
  3.     Position,Direction: TGeoSVec;
  4.     Distance : single;
  5.     ...
  6.   end;


Mein Objekt hat entsprechend folgende Variablen:

Code:
  1.   TGraEngineObject = record
  2.     ModelName: String;
  3.     ...
  4.     Position,Direction,Color: TGeoSVec;
  5.     Scale: single;
  6.     ...
  7.   end;


Wobei:

Code:
  1.   TGeoSVec = record
  2.     x,y,z: single;
  3.   end;


"Direction" meint bei mir folgendes :

1. Drehen um die X-achse um Direction.x grad
2. Drehen um die die nuh etstandene Y-achse um Direction.y grad
3. Drehen um die die nuh etstandene Z-achse um Direction.z grad

Code:
  1.   glrotatef(Direction.z,0,0,-1);
  2.   glrotatef(Direction.y,0,-1,0);
  3.   glrotatef(Direction.x,-1,0,0);


Dadurch sind alle möglichen Ausrichtungen im Raum abgedekt. (Bei einem Ego-Schooter würde eventuell ein Winkel (um Y-Achse) auch genügen und für eine enfache kammera zwei winkel (Y und X-Achse)!!!)
Die umrechnung diese Wwinkeltriplets in eine Vektorbasis und zurück ist allerdings recht aufwendig (Hier sind meine funktionen nicht ganz fehlerfrei >> grafikfehler in meiner physik-engine-demo).
Falls du die haben willst kann ich aber gerne meine geometry-unit mal zum download stellen...

Ich weiß nicht, ob die hier sonnst benutzte geometry unit derartige funktionen auch bietet???

ansonsten kann man diesen Kram durch rumprobieren am besten verstehen denke ich. Hat bei mir jedenfalls gereicht.

Auch wenn ich zunächst auch etwas verwirrt war bezüglich der Rotation :-)

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 17, 2005 21:02 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 10:30
Beiträge: 28
Moin !

Ich weiss ich nerve langsam aber ich habs auch durch probieren irgendwie noch nicht im Griff. Und deshalb nochmal kurz nachfragen ob ich das auch alles so richtig verstanden habe ....

Code:
  1.   1) gltranslatef(0,0,-Distance);
  2.  
  3.   2) glrotatef(Direction.z,0,0,-1);
  4.   glrotatef(Direction.y,0,-1,0);
  5.   glrotatef(Direction.x,-1,0,0);
  6.  
  7.   3) gltranslatef(-Position.x,-Position.y,-Position.z);
  8.  
  9.   for i := 1 to objectnumber do begin
  10.     glPushMatrix;
  11.  
  12.     4) gltranslatef(Model[i].Position.x,Model[i].Position.y,Model[i].Position.z);
  13.     5) glrotatef(Model[i].Direction.x,1,0,0);
  14.     glrotatef(Model[i].Direction.y,0,1,0);
  15.     glrotatef(Model[i].Direction.z,0,0,1);
  16.     6) glscalef(Model[i].Scale,Model[i].Scale,Model[i].Scale);
  17.  
  18.     7) Model[i].draw;
  19.  
  20.     glPopMatrix;
  21.   end;


Soderle, wenn das mein Code ist, dann verstehe ich das so:
1) Setzt die Kameraposition.
Wenn ich diese Koordinaten neu setze blicke ich aber weiterhin mit der gleichen Perspektive, oder? Es ändert sich quasi nur der Standpunkt der Kamera im Raum.
2) Tja, Rotation der Kamera ... Hiermit kann ich dann die Kamera um die Achsen drehen. Will ich nun also z.B. meine Kamera um das Objekt drehen, muss ich sie immer neu Positionieren und pässig drehen, oder?
3) Verschiebung des Kamerafokus. Öhm, das verstehe ich nun nicht. Ich habe doch die Kamera mit 1 und 2 passend positioniert. Warum also nun den Kamerafokus verschieben!?
4) Damit setze ich doch quasi mein Objekt in den Raum, oder?
5) Ok, damit kann ich halt das Objekt drehen. Und hier dreht sich dann auch nur das Objekt hoffe ich...
6) Hiermit ändere ich letztlich einfach nur die Größe des Objekts.
7) Objekt zeichnen

Soweit. Hoffe das stimmt soweit. Was ich aber noch nicht ganz verstanden habe ich die Rotation des Objekts um die eigene Achse. Angenommen ich habe nur einen Strich. Ich sage dann halt z.B.
gltranslatef(1,1,0);
so dann Objekt zeichnen also eine Linie von (x = 0.5, y = 1) bis (x = 1.5, y = 1)
Wenn ich nun glrotatef(45,1,0,0); mache. Wird dann das Objekt um den Mittelpunkt rotiert?
Weil das ist mir immer noch nicht klar wie ich halt um den Mittelpunkt rotiere. Ich finde das kommt auch in eurem Tutorial nicht so recht rüber. Oder ich habs einfach noch nicht verstanden (was das Prob sein wird :roll: ).

So long.

_________________
Greetz Moelski


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 17, 2005 22:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Ich mache das so, dass ich die Kamera um den Fokus (Die Kameraposition) herumdrehe. Du brauchst also nur die winkel ändern, um um dein objekt herumzudrehen...

Lange rede kurzer sinn: Habe hier mal ne demo programmiert. Basiert aufm OpenGL1.5 tamplate...

Einfach angucken und rumprobieren, hoffe dass hielft! Wie gesagt, meistens reichen für die kamra und die objekte 2 winkel, mit drei wirds leicht unübersichtlig. Entschuldigt , ich fasse mich jetzt kurz... das böse bier und ich will ins bett :-)


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

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 05:53 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 10:30
Beiträge: 28
Heureka :D

So ne Demo habe ich eigentlich immer gesucht.

Das werde ich mir jetzt im Details reinziehen und ich denke das klappt dann auch bei mir.

VIELEN DANK !!!!

_________________
Greetz Moelski


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 07:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
P.s.: Es gibt für Kameras auch noch weitere möglichkeiten, indem mann extra in die projektionsmatrix wechselt und da rumrotiert und so (glaube ich). Ich habe sowas nie gebraucht, aber ich wollte es nur mal erwähnt haben :-)

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 11:26 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Dein Code konnte auch net funktionieren denn du musst erst das Zentrum deines Modells in den KOU schieben und dann rotieren. Wenn du erst rotierst und dann verschiebst, steht das Modell irgendwie deplaziert in der Gegend rum. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Google [Bot] und 12 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.009s | 16 Queries | GZIP : On ]