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

Aktuelle Zeit: Fr Jul 18, 2025 11:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Darstellung eines Körpers
BeitragVerfasst: Di Sep 02, 2008 09:49 
Offline
DGL Member

Registriert: Di Sep 02, 2008 08:27
Beiträge: 5
Hallo Leute.

Leider bin ich noch relativ neu in der programmierung von OpenGL, deshalb hab ich gleich 2-3 Fragen.


Grundproblem:
Ich habe ein 2D Array mit Doublewerten, die Messpunkte darstellen.
Diese Messpunkte sind Teile eines Körpers und sollen mithilfe von OpenGL
3D dargestellt werden.

Das Zeichnen an sich ist kein Problem, allerdings das Darstellen in einem begrenzeten Fenster.
Ich hab ein Fenster, das natürlich nur einen geringen Teil des 3D Raumes darstellt.
Irgendwo in diesem Raum befinden sich meine (durch mit "GL_LINE_STRIP" verbundene) Messpunkte.
Diese Messpunkte, die durch die Linien, die sie verbinden eindeutig den Körper darstellen,
möchte ich nun unverzerrt in diesem begrenzten Fenster (soweit ich weis dem Frustrum) darstellen und
begutachten können (d.h. drehen und verschieben).
(ich schaffe es, den Körper sichtbar darzustellen, allerdings leider nicht, ohne ihn zu verzerren)

*Wie kann ich den Körper unverzerrt in meinem Fenster darstellen?
(meine Fenster beginnt z.b. bei 0/0/0 und hört bei 50/50/0 auf, die Tiefe ist mit max. 400 festgelegt.
der Messpunkt liegt aber z.b. bei 1/130/0-->ich muss mein Sichtfenster so verschieben, das ich diesen
Teil des 3D Raumes sehen kann)

*Wie kann ich den Körper vernünftig mit der Maus verschieben?
(Gegenwärtig hab ich dieses Problem mit der rechten Maustaste und verschieben bei "OnMouseMove" gelöst,
was aber nicht unbedingt schön ist...)

*Wie kann ich mir einen Rotationsmittelpunkt in der Mitte meines Körpers errechnen und
diesen Punkt dann auch als Rotationsmittelpunkt definieren?
(errechnen ist klar, aber wie definiere ich diesen Punkt dann, sodass der Körper exakt um diesen Punkt gedreht wird?)

Ich hoffe es kann mir jemand bei diesen Problemen helfen.
Vielen Dank auf jeden Fall schon mal.

MfG Börnie


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 02, 2008 16:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo, Börnie

Zitat:
*Wie kann ich den Körper unverzerrt in meinem Fenster darstellen?

Kurz und bündig: indem Du die adäquate Projektion wählst und die adäquate Kamerabewegung machst. Allerdings: jede Projektion verzerrt auch ein wenig.

PROJEKTION: Ich nehme an, Du möchtest Zentralperspektive, die OpenGL-Funktion heißt gluPerspective (oder auch glFrustum, ist aber etwas schwerer zu handhaben). Beschreibung siehe http://wiki.delphigl.com/index.php/gluPerspective

KAMERABEWEGUNG: die OpenGL-Funktion heißt glTranslate (genauer: glTranslatef). Ich würde Dir Folgendes empfehlen:

1. Verschiebung aller Punkte um den inversen Positionsvektor Deines Messpunktes dh. um (-1/-130/0), damit holt man das Objekt in den Koordinatenursprung
2. und anschließend Verschiebung um rund (0/0/-50), die -50 sind zu variieren, je nachdem wie breit oder hoch Dein Objekt ist. Das braucht man, denn um etwas von einem Objekt sehen zu können, muss man eine gewisse Distanz von ihm haben.

Die beiden Translationen fassen wir zusammen und haben jetzt: glTranslate(-1/-130/-50). Damit müsstest Du Dein Objekt eigentlich sehen können.
Wie macht man das? Den Translate Befehl hineinschreiben und anschließend die Punkte an OpenGL schicken. Das wars schon.



Zitat:
*Wie kann ich den Körper vernünftig mit der Maus verschieben?

Warum nicht mit den Cursortasten: Links/Rechts, Rauf/Runter und für nach vorn/hinten PageUp/PageDown verwenden. Das entspricht jeweils einem gesonderten Translate-Befehl für je eine Koordinatenachse

Zitat:
*Wie kann ich mir einen Rotationsmittelpunkt in der Mitte meines Körpers errechnen und diesen Punkt dann auch als Rotationsmittelpunkt definieren?


Punkt errechnen: Mittelwert aller Punkte ermitteln ("Center Of Mass")
Zwei Möglichkeiten gibts:

1. Entweder Du verschiebst alle Punkte mit dem inversen Vektor des errechneten Massenmittelpunktes, damit erhältst Du ein ganz gewöhnliches Modell, dessen Mittelpunkt im Koordinatenursprung liegt. So ein Modell kann man der OpenGL-Funktion glRotate um seine eigene Achse drehen. Man kann das relativ bequem machen, indem man zuerst glRotate verwendet und anschließend glTranslate mit dem inversen Positionsvektor Deines Messpunktes und dann alle Punkte an OpenGL schicken.

2. Oder Du möchtest Dein Objekt dort drehen, wo es grade ist, nämlich bei (1/130/0) (ist das eigentlich schon der errechnete Mittelpunkt?). Dann macht man das genauso wie oben, nur mit dem Unterschied, dass vor dem glRotate noch ein glTranslate mit dem Positionsvektor Deines Messpunktes stehen muss.

Das klingt kompliziert, aber dabei geschieht nur Folgendes:
*** Objekt in den Ursprung verschieben
*** Objekt im Ursprung um die eigene Achse drehen (das kann man nämlich nur im Ursprung)
*** Objekt wieder zurückverschieben

Leider verwirrt dabei OpenGL die Gemüter, weil man hier alles genau umgekehrt hineinschreiben muss. Ich nenne diese Vorgangsweise "Rotate Local", auf Deutsch "Drehen am Stand".
Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 03, 2008 06:08 
Offline
DGL Member

Registriert: Di Sep 02, 2008 08:27
Beiträge: 5
Hallo Traude.

glTranslate verwende ich bereits.
Ich kann auch mein Objekt so darstellen, das ich es sehen kann.
Schade fand ich bisher nur, dass mir nicht ganz klar war, ob ich
mit glTranslate den richtigen Befehl dafür verwende.
-1/-130/50 kommt übrigens ganz gut hin :)

Warum nicht mit den Cursotasten:
Gute Idee, werds mal versuchen.

Rotieren war mein größtes Problem.
Beim versuche, den Körper um eine bestimme Achse zu drehen bin ich gescheitert.
(weis auch warum: die Drehachse ist ja ein Vektor von 0/0/0 nach glRotate(Winkel,x,y,z),
wodurch ich immer eine "schräge Drehung" erhalte weil das in meinem Fall ein schiefer Vektor ist)
Danke für den Lösungsansatz, hilft mir sehr weiter.

d.h. ich nehme meinen COM (Center of mass--<annahme 30/130/30)
dann

glTranslatef(-30.0f,-130.0f,-30.0f);

mach dann die Rotation(je nachdem um welche Achse)

glRotate(Winkel,X,0,0)//für Rotation um die X-Achse wenn ich mich nicht irre

und verschiebe mein XYZ-System dann wieder so, das mein Objekt mittig in meinem OpenGL Fenster erscheint.
Jetzt muss ich das ganze noch an OpenGL schicken (ich nehme an du meinst SwapBuffer(); bzw. glFlush)

Stimmt das so?

Vielen Dank für die hilfe, das bringt mich einiges weiter.

Eine Frage hab ich noch.
Mein Körper ist ursprünglich 3D, ich stelle ihn 3D dar, will aber in separaten "Fenstern" ( ich hab eine Form mit einem OpenGL Kontext und mehreren anderen Bedienelementen), sprich z.B. Bitmaps in seinen diversen Ansichten (Draufsicht, Seitenansicht) darstellen.

Hast du da eventuell einen Lösungsansatz?
ich hätte versucht, das Objekt in die gewünschte Porition zu drehen, das ganze in die Zwischenablage zu kopieren, um es dann in ein Bitmap einzufügen.

MfG Börnie


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 03, 2008 13:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo, Börnie

Zitat:
und verschiebe mein XYZ-System dann wieder so, das mein Objekt mittig in meinem OpenGL Fenster erscheint.
Jetzt muss ich das ganze noch an OpenGL schicken (ich nehme an du meinst SwapBuffer(); bzw. glFlush)

Stimmt das so?


Mit "an OpenGL schicken" meine ich glBegin.. glEnd (oder was immer Du sonst benutzt) mit anschließendem SwapBuffers, ja.

Ja grundsätzlich stimmts aber ich habe noch etwas vergessen: beim Rotieren hast Du die ganze Zeit ja nur Dein Objekt manipuliert. Man muss aber noch daran denken, dass man das Objekt auch sehen will, daher braucht man noch den Translate-Befehl für die Kamera, also das, was wir ganz zuerst besprochen haben. Der Kamera-Translate-Befehl muss als erstes stehen, erst dann kommt die Objektmanipulation.


Zitat:
Mein Körper ist ursprünglich 3D, ich stelle ihn 3D dar, will aber in separaten "Fenstern" ( ich hab eine Form mit einem OpenGL Kontext und mehreren anderen Bedienelementen), sprich z.B. Bitmaps in seinen diversen Ansichten (Draufsicht, Seitenansicht) darstellen.


Das ist ein immer wiederkehrendes Thema. Ein guter Thread dazu ist: http://www.delphigl.com/forum/viewtopic.php?t=5866&start=0&postdays=0&postorder=asc&highlight=
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 04, 2008 08:35 
Offline
DGL Member

Registriert: Di Sep 02, 2008 08:27
Beiträge: 5
Hallo Traude.

Hab das jetzt mal probiert (so mit verschieben und rotieren).
Irgendwas passt .nicht ganz, ich find nur momenten meinen Fehler nicht

Ich hab mit den Mittelpunkt meines Körpers errechnet und dann mit glTranslatef um die
entsprechend negativen Koordinaten verschoben, dann gedreht und wieder zurück verschoben

also bei COM =30/130/30
glTranslatef(-30.0f,-130.0f,-30f);
glRotate(90,0,0,30); //für eine Rotation um die Z-Achse
glTranslatef(30.0f,130.0f,30.0f);
glBegin(GL_LINES);
//Messwertdarstellung
glEnd();
SwapBuffers;

mit dem Resultat, das sich der Körper leider nicht wie erwartet um seine eigene Achse dreht sondern um einen relaitv willkürlichen Punkt im Raum.
Außerdem schaffe ich es nach diesen Aktionen nicht mehr, den Körper in den für mich sichtbaren Bereich zu verschieben.

Weist du woran das liegen könnte?

mfG B.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 04, 2008 10:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo, Börnie

Ich denke schon. Das ist nämlich der Fluch von langen Beiträgen: die Leute lesen sie nicht mehr genau. Ich sagte oben irgendwo, dass OpenGL die Transformationen umgekehrt macht, als man annimmt, dass es sein müsste. Deswegen musst Du es so machen:

Annahme: Objektmittelpunkt ist (+100/+100/+100)

Projektion einstellen....
Auf Modelview-Matrix umschalten....

Transformationen:
1. Kameraverschiebung (das ist die Transformation, die dein Objekt sichtbar werden lässt): glTranslate(-100/-100/-150)
2. Objekt auf seinen Platz zurückschieben: glTranslate(+100/+100/+100)
3. Objekt rotieren (z.B. 45 Grad um die Y-Achse): glRotate(45,0,1,0);
4. Objekt in den Ursprung verschieben: glTranslate(-100/-100/-100)

glBegin
Punkte ......
glEnd

SwapBuffers



Diese nummerierten Transformationen sind von oben nach unten gelesen völliger Schwachsinn.

Wenn man die nummerierten Transformationen jetzt UMGEKEHRT von unten nach oben liest, kann man verstehen, was da passiert. Hier sieht man auch ganz deutlich, dass es eine Fleißaufgabe ist, das Objekt an seinen Platz zurückzuschieben, denn die Transformationen 1 und 2 heben sich gegenseitig FAST auf. Man könnte daher Transformation 2 ganz weglassen *) und bei Transformation 1 nur ein wenig nach Z-Minus verschieben. Es bleibt:

1. Kameraverschiebung: glTranslate(0/0/-50)
2. Objekt rotieren: glRotate(45,0,1,0)
3. Objekt in den Ursprung verschieben: glTranslate(-100/-100/-100)

Traude :wink:


*) Direkt aufeinanderfolgende Verschiebungen kann man zusammenfassen. Bei Rotationen ist das NICHT möglich. Wenn Verschiebungen durch Rotationen getrennt sind, darf man sie auch nicht zusammenfassen. Die Gründe dafür liegen in der Vektoren- und Matrizenrechnung begründet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 05, 2008 05:47 
Offline
DGL Member

Registriert: Di Sep 02, 2008 08:27
Beiträge: 5
Vielen Dank, das klappt jetzt.

Hatte leider zusätzlich noch ein paar Befehle verbaut, die die Funktion so wie ich sie wollte verhinderten...

Kennst du dich vielleicht auch mit Licht in OpenGL aus?
Natürlich möchte in den Körper ja optisch ansprechend darstellen.
Dazu errechne ich mir (wie bei STL) Dreicksfacetten, die dann die Oberfläche bilden.
Dem ganzen geb ich eine Farbe, die dem Material des Originals möglichst nahe kommt.
Nur verlier ich dadurch dann ja jede Kontur, was ich gern durch Beleuchtung (wodurch ich
zwar die gleiche Grundfarbe aber unterschiedliche Helligkeiten Aufgrund der Beleuchtung habe)
lösen würde.

Wie macht man sowas?

Ich hab das Thema mal "überflogen" (Kameras durch Blickpunkt, Helligkeit und RGBA definieren etc.), bin allerdings nicht so richtig schlau daraus geworden.
Soweit ich weis gibt es ja mehrere unterschiedliche Lichtquellen, die unterschiedliche Effekte hervorrufen.

Außerdem hab ich mal kurz versucht, so eine Lichtquelle zu erstellen und zu verwenden, mit dem Ergebnis,
das ich meinen Körpe gar nicht mehr sehen konnte...

mfG und schönes Wochenende!
B.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 05, 2008 07:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo, Börnie

Ich fürchte, für Licht bin ich kein Experte. Ich selber habe meine ganze Weisheit aus diesem Tutorial in unserem Wiki: http://wiki.delphigl.com/index.php/Tutorial_Lektion_8

Falls Du es damit versucht hast und gescheitert bist, kann ich Dir jedenfalls aber einen Tip geben: in dem Tutorial FEHLT etwas, nämlich: "glEnable(GL_COLOR_MATERIAL)". Mit diesem Zusatz funktioniert es dann.

Auch Dir ein schönes Wochenende
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 09, 2008 05:42 
Offline
DGL Member

Registriert: Di Sep 02, 2008 08:27
Beiträge: 5
Hallo Traude.

Vielen Dank trotzdem, hat mir sehr geholfen.

Licht lass ich fürs erste, wär sowieso eher eine Spielerei und
ist für meine Anwendung eigentlich nicht unbedingt erforderlich...

mfg B.


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


Wer ist online?

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