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
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.
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
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
@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:
RenderNode( child )
{
glPushMatrix()
glMultMatrix ( Transformationsmatrix des childs )
Objekt rendern ()
für alle Kinder i von child
RenderNode( child->Kind(i) )
glPopMatrix ()
}
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?!?
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
@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.
[/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....
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?
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.
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.
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
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.
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
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.