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

Aktuelle Zeit: Fr Jul 18, 2025 21:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Sep 17, 2006 14:31 
Offline
DGL Member

Registriert: So Sep 17, 2006 03:52
Beiträge: 2
Hallo,

ich schreibe einen einfachen kleinen 3D-Betrachter, in dem es um die Darstellung von Planeten geht. Die Rotation funktioniert problemlos, aber ich bekomme es einfach nicht hin, mittels glTranslatef mein Objekt zu verschieben, sodass der Mittelpunkt immer da ist, wo ich mit der Mouse bin. Ich möchte einfach nur alle Objekt damit verschiebbar machen. Später hätte ich auch gerne, dass der Mittelpunkt für die Rotation immer in der Bildschirmmitte ist, aber ich wäre schon mal mit dem einfachen Verschieben glücklich.

Ich benutze dazu gluUnproject, wie es m Wiki erklärt wird. Wenn ich mir die Mousekoordinaten ausgeben lasse, sind diese auch eindeutig korrekt. Aber sobald ich sie dann an glTranslatef übergebe, springt der Bildausschnitt an eine falsche Stelle. Ich brauche eigentlich nur ein Verschieben auf X- und Z-Ebene. Ich weiß einfach nicht mehr weiter.

Ich habe meinen Sourcecode mal angehängt, falls sich jemand daran versuchen möchte.

Rotation mit der rechten Mousetaste, Verschieben mit Shift und rechter Mousetaste.

Dank im voraus!


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 25, 2006 19:59 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jun 20, 2003 13:59
Beiträge: 134
Mahlzeit.

Also zu deinem Problem mit dem verschieben hätte ich jetzt ja nichts anzubieten aber
das Rotieren um die Bildschirmmitte:

Code:
  1.  
  2. gltranslatef(0,0, {Entfernung zum Planeten});
  3.  
  4. glrotatef(...)//Rotieren des Planeten
  5.  
  6. gltranslatef(x,y,0); //Verschieben des Planeten
  7.  
  8. //Planet zeichnen
  9.  

_________________
ghost-site.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 25, 2006 21:21 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Im Grunde liegt das Problem nur an der Diskrepanz zwischen OGL Koordinaten und Mauskoordinaten. Diese beiden Koordinaten sind nur dann identisch, wenn ich per glTranslate so weit vom Geschehen weggehe, dass eine Längeneinheit im OGL 1 Pixel ist und das ist sehr weit.
Also müsste man anhand des momentanen Abstandes zum Geschehen (, in diesem Fall Z) den Wert ausrechnen, mit dessen Hilfe man MausKoordinaten in OGLKoordinaten umrechnen kann und umgekehrt.

Ka ob man OGLKoordinaten sagen sollte, ich nenns einfach ma so, weils denke ich verständlich ist.

ein Beispiel.
Wenn das Koordinatensystem in der Z-Achse 15 Einheiten von mir entfernt ist, dann ist eine X- bzw Y-Einheit zwischen 50 und 100 Pixeln groß. Bedenken muss man auch, dass nicht nur die Translation sondern auch die Rotation und die Auflösung des Bildschirms eine Rolle spielen.

Es ist also wirklich nicht so einfach. Wer sich abe ransetzen möchte und so eine Funktion schreiben möchte (,denn alsozuschwer sollte es nicht sein) ich würde sie begrüßen. Vielleicht allerdings erzähl ich auch grad blödsinn und sowas gibs schon lange :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 25, 2006 23:46 
Offline
DGL Member

Registriert: So Sep 17, 2006 03:52
Beiträge: 2
Danke für eure Antworten!

Mein Problem müsste doch eigentlich recht einfach zu lösen sein, oder? Schließlich hat so ziemlich jeder 3D-Objektviewer die Funktion, dass ich entweder ein Objekt mit der Mouse "anfassen" und verschieben kann, oder aber das ganze Koordinatensystem verschieben kann. Dummerwiese habe ich noch keinen Viewer mit Source gefunden, anhand derer ich das hätte nachvollziehen können. So ein Verschieben ist doch eine absolute Standardfunktion. Unglücklicherweise bin ich alles andere als ein Mathe-Guru, weiß also auch nicht, wie ich es berechnen könnte.

Hat jemand eine Idee, wie ich das realisieren könnte? Das ist nämlich eine der wenigen Sachen, die im Programm noch fehlen.

Das Rotieren um den (neuen) Mittelpunkt muss ich danach in Angriff nehmen, bisher kann ich ja leider nichts verschieben :(

Danke!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 26, 2006 01:05 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Ich habe mir dein Projekt nicht angesehen (kein Delphi drauf und kann es auch kaum), aber wenns nur um das Verschieben von Objekten geht, dann sollte das eigentlich recht einfach gehen. Ich weiß nicht wie du es zur Zeit machst (eine textuelle Beschreibung wäre ggf. nicht fehl am Platz) aber ich denke ich würde das etwa so machen:

1. Mausklick auf das Objekt.
=>
- du findest das Objekt heraus auf das geklickt wurde (hier gibt es mehrere Möglichkeiten wie du das machst).
- du kennst die 2D-Koordinaten des Mausklicks und auch die Tiefe.

2. Maus fährt herum.
=> du hast eine neue 2D-Position der Maus.

Wenn du nun die 2D-Koordinaten der neuen Mausposition mit gluUnProject mit dem Tiefenwert der vorigen Mauskoordinaten verwendest, so erhältst du eine neue 3D-Position an dem sich der Punkt auf den du geklickt hast befinden sollte. Du kennst das Objekt auf das geklickt wurde und wenn du nun dieses Objekt entsprechend des Offsets der 2 Punkte verschiebst, dann ist auch der Punkt auf den du geklickt hast entsprechend verschoben worden.

In C-Pseudocode sollte das nun etwa so aussehen:
Code:
  1.  
  2. Global:
  3. float PunktTiefe;
  4. Vector3D VorigePosition;
  5. Objekt Obj;
  6.  
  7. void OnMouseClick( float X, float Y )
  8. {
  9.   // Tiefe herausfinden wie im gluUnProject-Wiki-Artikel
  10.   // Objekt "Obj" auf das geklickt wurde herausfinden und speichern.
  11.   Vector3D VorigePosition = Ergebnis von gluUnProject( X, Y, tiefe, ... );
  12.   PunktTiefe = tiefe; // also die tiefe des (2D-) Punktes speichern.
  13. }
  14.  
  15. void OnMouseMove( float X, float Y )
  16. {
  17.   Vector3D NeuePosition = Ergebnis von gluUnProject( X, Y, PunktTiefe, ... );
  18.   Vector3D Offset = NeuePosition - VorigePosition;
  19.   Obj.Move( Offset ); // Move hier weil translate die Rotation des Objektes mit einbezieht. Hier solltest du nur die Position (die 4. Spalte der Matrix) ändern unabhängig von der Rotation.
  20.   VorigePosition = NeuePosition;
  21. }
  22.  

Die PunktTiefe bleibt natürlich konstant, da du dein Objekt wahrscheinlich parallel zur Z-Ebene verschieben möchtest.

Dieser Code ist jetzt etwas nachlässig bzgl. Rundungsfehlern und so, aber das lässt sich ja noch verbessern. Wie gesagt wäre es hilfreich zu wissen wie du es (meinetwegen im Vergleich zu diesem "Code") gemacht hast.


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 2 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.008s | 15 Queries | GZIP : On ]