Frage für echte Experten

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Foppele

Betreff: Frage für echte Experten

BeitragDi, Dez 18, 2007 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hier mal eine Frage an die Mathegenies und Programmierprofis unter euch.
Ich weiss, es ist eine sehr spezielle Frage, aber vielleicht kennt sich ja jemand aus. Also:

Ich bin gerade dabei ein Skelett/Animationssystem für B3D zu basteln. Dabei habe ich bis jetzt die Blitz - interne Euler Rotation benutzt.
Wie diejenigen unter euch die vielleicht Animationserfahrung haben, kommt es bei Euler Rotationen häufig zu Fehlern und unkontrolliertem Achsenflippen, dem sog. Gimbal Lock.
Auch Matrixrotationen sollen dieses Problem haben, aber bei Quaternionen soll dieses Problem nicht auftreten.
Jetzt meine Frage: Objekt X ist an Vektor A aligned. Vektor A verändert sich. Objekt X wird wieder an Vektor A angepasst --> Gimbal Lock wg. Euler.

Würde es einen Unterschied machen, die Rotation von Vektor A in ein Quaternion umzurechnen und dieses wieder in Euler Winkel und Objekt X zu rotieren? Oder kann man das so nicht umgehen?
 

Dreamora

BeitragDi, Dez 18, 2007 1:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst Gimbal Lock net umgehen. Die rotationsbefehle von Blitz3D sind immer mit Euler, egal wie du es umrechnest. Konsequenz: die Transformation wird auch immer an Gimbal leiden

aber lässt sich einfach lösen: einfach keinen rotationswinkel von 90° zulassen
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Foppele

BeitragDi, Dez 18, 2007 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Dreamora,
Nein, leider kann ich die Rotation nicht beschränken. Zwar braucht man für kein Gelenk alleine die kommpletten 360 Grad Rotationsfreiheit, aber durch die Kombination von mehreren Rotationen von mehreren Gelenken müssen dann doch alle möglichen Rotationswinkel zur Verfügung stehen.
Ich könnte halt noch eine gewöhnliche Parent-Child Hierarchie für mein Skelett benutzen und jeden Bone einzeln rotieren, (darauf wird es wohl hinauslaufen wenn ich das ganze nicht mit Quaternionen lösen kann),
meine Idee war es aber ein Skelett mit Effektoren zu steuern und zumindest für die Beine, eine simple IK zu verwenden.
Das geht aber nur mit AlignToVektor oder Pointentity, AligntoVektor führt aber aufgrund von kleinen Ungenauigkeiten die sich mit der Zeit addieren zu verdrehten Achsen, und Pointentity ( was quasi das gleiche ist, bloss mit "gelockter" Point-Achse, führt halt zu dem Gimballock Problem.

Ich werde mal ausprobieren was passiert, wenn ich Quaternionen zur Achsenberechnung verwende und diese dann in Euler umrechne.
 

Dreamora

BeitragDi, Dez 18, 2007 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde da weder PointEntity noch AlignToVektor nehmen

Schau dir ma TFormPoint, TFormVector und TFormNormal an
Damit solltest du eigentlich min. so schnelle Lösung erzeugen können aber keine float ungenauen (ausser natürlich dem bereich der Float die Blitz3D garnet unterstützt den Blitz hat nicht volles float sondern eher was richtung 6 stellen fixed point float)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Foppele

BeitragDi, Dez 18, 2007 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja die Tform Befehle kenne ich, aber wie sollen die mir weiterhelfen? Ich will ein Objekt (Bone) auf ein Target ausrichten. Dabei sollen aber folgende Bedingungen erfüllt werden:
1. Wenn nach X Transformationen die Ausgangsstellung wieder erreicht wird, sollen alle Achsen exakt so orientiert sein wie am Anfang.
2. Darf keine Achse anfangen zu flippen.

btw. Leider glaube ich nicht, das es da eine einfache Lösung gibt, professionelle 3D Animationsprogramme leiden unter dem Problem, es gab wohl einige halbausgereifte Lösungen um das einigermassen zu kompensieren, aber inzwischen benutzt man meistens Quaternions.

Mein Gedanke war jetzt:
Eigentlich reichen ja die Euler Winkel aus um jeden beliebigen Rotationszustand zu beschreiben. Das Problem Gimbal Lock tritt bei der Interpolation von einem Rotationszustand zum anderen auf, dehalb könnte man möglicherweise mit Quaternion berechnen und nur in Euler umwandeln um das Objekt zu zeichnen.
 

Dreamora

BeitragDi, Dez 18, 2007 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Gimbal Lock tritt nicht wegen irgendwelchen Rotationen auf, sondern weil Blick in +- Z Richtung nicht eine eindeutige Ausrichtung ist, sondern unendlich viele.

Wenn du das via Quaternions umgehst dann kannst du potentiell mit Quaternions arbeiten.

Potentiell weil du beim "extrahieren" der Winkel darauf achten musst sie auch in der richtigen Reihenfolge anzuwenden. Denn rotation um x, dann y, dann z ist, wie du ja sicher weisst nicht das gleiche wie um z, dann y, dann x zb.
Und ich weiss grad net wie rum die intern angewandt werden wenn man rotateentity nimmt.


Und inwiefern dir die TForm da helfen:
Was ist eine Ausrichtung?
-> Ein Vektor
Was ist ein normierter Vektor?
-> Ein vektor der länge 1 in der einheitskugeln. Seine 3 Längen in den Dimensionen definieren direkt die Winkel zu X,Y,Z

Deswegen würd ich sagen hilft das durchaus Smile

Wenn du das ganze ernsthaft umsetzen willst, würd ich sowieso vorschlagen da die blitzbefehle zu kicken und die IK in C oder PureBasic als DLL umzusetzen und dort jeweils nur die Euler rauszuholen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Foppele

BeitragDi, Dez 18, 2007 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:

-> Ein vektor der länge 1 in der einheitskugeln. Seine 3 Längen in den Dimensionen definieren direkt die Winkel zu X,Y,Z


Das war mir gar nicht bewusst. Danke!

Das ganze als DLL?
Da ich ja nicht hunderte Vertices sondern nur ein paar Bones rotieren will, ist das wohl nicht nötig. Habe auch nur rudimentäre C Kenntnisse, aber wenn das klappt mit den Quaternions aber doch zu langsam ist, wär das natürlich eine Idee.

Auf jedenfall hab' ich alle Formeln am Start. Muss jetzt als nächstes rausfinden, ob die Umwandlung eines Quaternions in Euler immer eindeutig ist.

[EDIT] Quaternions funktionieren! Aber ich hab einen besseren Workaround gefunden, Ich benutze jetzt Align to Vektor, aber setze an Anfang jedes Frames alle Rotationen auf Null.
Dadurch gibt's keine sich addierenden Ungenauigkeiten mehr,
tja, mit einer Zeile Code 100 Zeilen gespart.

Vielleicht sind die Quaternions doch noch zu was gut, ich hab gelesen dass man sie einfach interpolieren kann...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group