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

Aktuelle Zeit: Fr Jul 18, 2025 21:01

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Objekt schrittweise ausrichten
BeitragVerfasst: Di Jan 09, 2007 12:12 
Offline
DGL Member

Registriert: Sa Jan 06, 2007 16:38
Beiträge: 5
Hallo zusammen,

ich versuche gerade ein Objekt auf einen Punkt auszurichten. Dabei speichere ich für dieses Objekt ein lokales Koodinatensystem, das ich bei jeder Rotation mitdrehe. Den Z-Vektor dieses lokalen Koodinatensystems lasse ich auf das Objekt zeigen, die anderen beiden Vektoren ergeben sich per Kreuzprodukt, also ganz normales Verfahren...Aus diesen drei Vektoren bastel ich mir dann meine Rotationsmatrix und fertig....Klappt auch.


Probleme gibts, wenn ich das Objekt nicht auf einmal drehen möchte, sondern bei jedem Frame ein Stückchen weiter.
Wie würdet ihr das machen?

Mein erster Versuch ging in die Richtung, die beiden Winkel alpha und beta ( Drehung um x-Achse und y-Achse zu bestimmen). Wollt dann diese Winkel durch z.b. 100 teilen, jeden Frame ein Stück rotieren, so dass die Rotation nach 100 Frames abgeschlossen ist, aber irgendwie haut das nich so hin?!?

Oder soll ich aus den zwei Winkeln Zwischenpunkte berechnen, auf die ich dann mein Koordinatensystem mit der ersten Methode ausrichte?

Oder kann man zwischen der anfänglichen und entgültigen Rotationsmatrix äh interpolieren. Und sind dafür Quaterionen geeignet?!?


Hoffe, ihr könnt mir da helfen
Vielen Dank für jede Antwort :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 09, 2007 13:49 
Offline
DGL Member

Registriert: Sa Jan 06, 2007 16:38
Beiträge: 5
Habs jetzt erstmal so gemacht, dass ich alle 20 Frames die Rotationsachse per Kreuzprodukt aus meinem lokalen Nach-Vorne-Vektor und dem Richtungsvektor von meinem Objekt zum Zielpunkt hin berechne.

Den Winkel entsprechend per Skalarprodukt, geteilt durch 10 zum Beispiel.
Ich rotiere danach mein lokales Koodinatensystem um diese Rotationsachse und natürlich mein Objekt.

Das klappt auch, aber würdet ihr das auch so machen?

Es kommt mir mathematisch nicht gerade einwandfrei vor, da es sein kann, dass das Kreuzprodukt degeneriert. Au0erdem gefällt mir nich, dass ich meinen Winkel aus dem Skalarprodukt mit acos berechnen muss, diesen dann durch 10 teile und danach wieder den Cosinus und Sinus bestimme, um die Rotationsmatrix aufstellen zu können.

Bin dankbar für jeden Vorschlag... :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 10, 2007 10:34 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Rotationsachse sollte doch über die gesamte "Animation" hinweg gleich bleiben. Dann musst du die auch nur einmal berechnen (bzw. immer dann wenn die beiden Objekte zueinander die Position ändern.).

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 10, 2007 11:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Die Rotationsachse ändert sich, wenn sich das Zielobjekt auch bewegt.

Zitat:
Es kommt mir mathematisch nicht gerade einwandfrei vor, da es sein kann, dass das Kreuzprodukt degeneriert.

Das müsstest Du in Deiner Berechnungsroutine mit einer Fehlerbehandlung abfangen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 10, 2007 17:43 
Offline
DGL Member

Registriert: Sa Jan 06, 2007 16:38
Beiträge: 5
Zitat:
Zitat:
Es kommt mir mathematisch nicht gerade einwandfrei vor, da es sein kann, dass das Kreuzprodukt degeneriert.
Das müsstest Du in Deiner Berechnungsroutine mit einer Fehlerbehandlung abfangen.


Hab ich auch erstmal so gemacht! Dachte nur, wenns mans ganz anders macht, ( Quaternionen oder so?!? ) erledigt sich das Problem gleich mit :D

@Flash....das stimmt natürlich. Danke für den Hinweis. Der Winkel bleibt ebenso konstant und damit die ganze Rotationsmatrix.

Steh jetzt allerdings vor einem, wie mir scheint, größerem Problem:
Ich habe ein Mesh, das ich hierarchisch im Speicher habe (Szenengraph). Hier als Beispiel

SimpleBot
    Oberkörper
      Linker Arm
      Rechter Arm
      Kopf
    Rechtes Bein
      Rechter Unterschenkel
    Linkes Bein
      Linker Unterschenkel


Und zu jedem Knoten eine entsprechende Transformationsmatrix.
Gezeichnet wird dann so: ( Pseudocode )

Code:
  1.  
  2. RenderNode( child )
  3. {
  4.       glPushMatrix()
  5.      
  6.        glMultMatrix ( Transformationsmatrix des childs )
  7.  
  8.        Objekt rendern ()
  9.  
  10.        für alle Kinder i von child
  11.           RenderNode( child->Kind(i) )
  12.  
  13.       glPopMatrix ()
  14. }
  15.  


Das klappt soweit. Das Problem: Die Objektausrichtung klappt nur für den Root-Knoten. Wenn ich einen Child-Objekt auf ein Ziel ausrichten möchte ( den Kopf z.B. ) ermittle ich ja aus dem Nach-Vorne-Vektor des Kopfes und dem Richtungvektor ,Kopfposition->Objektposition, die Rotationsmatrix. Wenn ich die beim Zeichnen des Kopfes bei glMultMatrix einsetze, kommt aber totaler Mist raus.

Dies liegt, glaube ich, daran, dass diese Rot-Matrix ja eine absolute Drehung angibt und keine relative zu der des Oberkörpers.
Heisst das ich muss diese Rotationsmatrix nun mit der Inversen des Oberkörpers und dies dann mit der Inversen des Roots mutiplizieren, damit es beim Zeichnen mit Rendernode funktioniert, oder mach ich mir das irgendwie zu schwer?!?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 10, 2007 22:22 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Stell Dir mal so ein menschliches Mesh vor. Du weißt schon, mit diesen ausgebreiteten Armen. Du hast z.B. das ganze Mesh um 90 Grad um die Y-Achse gegen den Uhrzeigersinn gedreht. Jetzt willst du den ganzen rechten Arm senken. Es ergibt sich das Problem, welche Transformationsmatrix für den Arm gilt. Für die Ermittlung der Transformationsmatrix des Arms muss man in den "Armraum" gehen. (soll heißen, man muss das Koodinatensystem wechseln). Der Koordinatenursprung für den "Armraum" befindet sich an der Schultergelenkposition. Der Koordinatenursprung für den Unterarm befindet sich am Ellenbogen usw.

Ich weiß nicht, wie Pixar es macht, aber ich mache es so:

Verschiebung des Arms (dh. alle Vertices des Arms) um den Vektor Schultergelenk ==> Koordinatenursprung des Objekts. Dann Befindest Du dich im "Armraum" und kannst Deine Rotation ausführen. Dann muss eine Rückverschiebung stattfinden. Jetzt haben wir ein Zwischenergebnis: der Arm wurde gesenkt. Für die korrekte Transformation muss dann noch das ganze Mesh mit der Objekttranformationsmatrix multipliziert werden. Das sieht dann so aus:

1) ObjektMatrix ermitteln
2) OberArmMatrix = OberArmMatrix (wie oben beschrieben) X ObjektMatrix
3) UnterArmMatrix = UnterArmMatrix (analog zur OberArmMatrix) X OberArmMatrix

und so weiter, und so fort. Wenn Du bei der Hand angelangt bist, sind bereits vier Matrizen in die Berechnung eingegangen.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 11, 2007 10:06 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Pixar macht das bestimmt in einem Modeller, und schert sich einen Sch****reck um Matrizen. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 11, 2007 17:11 
Offline
DGL Member

Registriert: Sa Jan 06, 2007 16:38
Beiträge: 5
Hallo,


@Traude
Mir ist noch der Unterschied zwischen dem von dir beschriebenen Verfahren und meinem nicht ganz klar.
Ich versuch das Problem nochma kurz anders zu erklären...

Also ich habe folgenden Bot, bestehend aus Rumpf, Kopf, Linken und Rechtem Arm mit jeweiligem Unterarm.

Bild[/img]

Die Schwarzen Kreise in der Abbildung sollen die Gelenkpunkte sein. Zu jedem Gelenkpunkt, speichere ich eine
Transformationmatrix, die mir die Rotation und Translation relativ zum übergeordneten Gelenktpunkt angibt.
Wenn ich nun zeiche passiert also folgendes....


1. PushMatrix()
2. ModelViewMatrix = ModelViewMatrix * Matrix ( G_Root ); Rumpf zeichnen

3. PushMatrix()
4. ModelViewMatrix = ModelViewMatrix * Matrix ( G_Kopf ); Kopf zeichnen
5. PopMatrix ()

5. PushMatrix()
6. ModelViewMatrix = ModelViewMatrix * Matrix ( G_ArmL ), Linken Oberarm zeichnen
7. PushMatrix()
8. ModelViewMatrix = ModelViewMatrix * Matrix ( G_UArmL ), Linken Unterarm zeichnen
10.PopMatrix()
11.PopMatrix()

12. wie 5. nur mit rechtem Arm

Es wird auch alles korrekt gezeichnet. Ich kann den Mesh auch animieren, wie ich möchte, stimmt auch alles.

Das Problem ist folgendes:
Sagen wir, der Bot bewegt sich durch die 3DWelt (Es wird also Matrix( G_Root ) verändert ).
Und ich möchte nun aber, dass der linke Unterarm immer auf einen festen globalen Punkt P ausgerichtet bleibt,
egal wie mein Bot gedreht oder translationiert ist. (Skalierung kommt nich vor ).

Wie berechne ich nun die Transformationsmatrix für G_UArmL?
Ich hab mich damit noch nicht beschäftigt, aber macht man so etwas mit inverser Kinematik?

Gruss


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 11, 2007 20:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo,
ich habe mir letztes Jahr - als ich das ganze programmiert habe - eine ziemlich große Bibliothek Inverse Kinematic angelegt. Ich habe bei dieser Bibliothek einen eindeutigen Favoriten. Leider ist das ein Power-Point-File und über ein MB groß und ausserdem englisch. Das kann ich wegen der Größe hier nicht hochladen - und ich dürfte es wahrscheinlich auch gar nicht hochladen, schließlich ist der Inhalt von Jemand anderem. Aber ich habs im Internet nicht mehr gefunden.

Zu Deinem Glück habe ich eine ganz gute deutschsprachige Unterlage gefunden: http://www2.dfki.de/~kipp/seminar/folien/Johannes_Char_Anim.pdf

Außerdem lade ich hier ein Zip-File mit einer Rich-Text-Datei und zwei jpg-Bildern hoch. Die Bilder wären in die Datei einzufügen (sie sind im Text erwähnt). Ich musste sie aus der Datei herausnehmen, Weil Word aus Text und Bildern eine 3MB-Datei gemacht hat. Diesen Text und die Bilder habe ich im Schweiße meines Angesichts selber gebastelt und sie haben mir als Programmiergrundlage gedient. Ich hoffe, sie helfen Dir weiter. Das Thema Inverse Kinematic ist einfach zu komplex, um es in ein paar Sätzen abzuhandeln.
Traude


Da fällt mir noch was ein: es gibt sogar einen Delphi Programm Code: http://www.basegraph.com/bg/ger/menu.htm
unter "Projekte und Demos". Ist von einem dgl-Member, glaub ich


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 12, 2007 09:31 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du der Meinung bist, der Text hilft anderen beim verstehen von IK, dann frag ich mich warum der noch nicht in unserem Wiki steht... :x ;)

Also los --> Eintragen!

(Oder ein Tutorial draus bauen.)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 12, 2007 09:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Aber Flash,
das ist doch nur ein Denkanstoß. Dieses Zeug macht offenbar jeder anders. Wenn man sich im Net ein bisschen umsieht, kann man alles entdecken, von ganz kompliziert ("Jacobi-Matrizen", zum Beispiel) bis relativ einfach. Und ich bin nun mal kein Mathematiker. Das ist nicht DIE Art, sowas umzusetzen, sondern bloss meine eigene.
Traude

@Edit: Ha, ich habe den Link wiedergefunden: http://pages.cpsc.ucalgary.ca/~mario/587/7-kinematics/IK-1.ppt
Wie gesagt, 1MB groß, Power-Point-Format, Englisch, aber: very useful indeed.

Dieser Artikel wäre es wert, übersetzt zu werden. Aber ich hab ein Problem: ich mache derzeit die dgl-GUI und bin damit ausgelastet. Ihr könnt es Euch aussuchen: Ich wäre bereit, diesen Artikel allgemeinverständlich zusammenzufassen, zu übersetzen und ins Wiki zu stellen. Allerdings müsst Ihr dann warten, bis ich mit der GUI fertig bin. Wie lang das dauert, kann ich nicht sagen.
Traude

@Edit2: Öhm, bevor man im Wiki was über inverse Kinematik schreibt, muss man zuerst was über ANIMATIONEN schreiben, sonst hängt das Thema ja in der Luft.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 12, 2007 14:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Jeder kann im Wiki Artikel verfassen die mit dem Thema des Wikis harmonieren. Ich würd mich freuen, wenn einfach mal paar neue schicke Artikel im Wiki auftauchen.

_________________
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: 0 Mitglieder und 1 Gast


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 ]