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

Aktuelle Zeit: Sa Jul 12, 2025 21:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jul 16, 2009 15:00 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hallo alle zusammen,

Ich versuche seit einigen Tagen mein Bonesystem auf Quaternionen umzustellen, damit ich Animationen aus Blender importieren kann. Allerdings nicht sehr erfolgreich. Ich konnte den Fehler schon ein bischen eingrenzen, aber mir fehlt das mathematische Verständnis um ihn zu beheben.

Also das Problem scheint die Funktion zu sein, die das Quaternion auf den Vector anwendet. Ich hab' den Code aus dem Wiki übernommen:

Code:
  1.  
  2. q00:=q[0]*q[0];
  3. q01:=q[0]*q[1];
  4. q02:=q[0]*q[2];
  5. q03:=q[0]*q[3];
  6. q11:=q[1]*q[1];
  7. q12:=q[1]*q[2];
  8. q13:=q[1]*q[3];
  9. q22:=q[2]*q[2];
  10. q23:=q[2]*q[3];
  11. q33:=q[3]*q[3];
  12.  
  13. Result[0]:=v[0] * (q00+q11-q22-q33) + 2 * (q12*v[1]+q13*v[2]+q02*v[2]-q03*v[1]);
  14. Result[1]:=v[1] * (q00-q11+q22-q33) + 2 * (q12*v[0]+q23*v[2]+q03*v[0]-q01*v[2]);
  15. Result[2]:=v[2] * (q00-q11-q22+q33) + 2 * (q13*v[0]+q23*v[1]-q02*v[0]+q01*v[1]);
  16.  


Allerdings produziert das irgendwie andere Resultate als Blender. Deshalb hab ich stattdessen versucht das Quaternion erst in eine Matrix umzuwandeln, was exakt das selbe bewirkt wie der Code oben (die Matrix hab ich wie unter http://www.mathworks.com/access/helpdesk/help/toolbox/aeroblks/quaternionrotation.html gebildet)

Also entweder mach' ich irgendwie einen elementaren Fehler oder es liegt an Blender bzw. wie das funktioniert. Könnte sein das bei Blender irgendwas anders gerechnet wird, kA. Ich bin eben ziemlich ratlos.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 16, 2009 21:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Allerdings produziert das irgendwie andere Resultate als Blender. Deshalb hab ich stattdessen versucht das Quaternion erst in eine Matrix umzuwandeln, was exakt das selbe bewirkt wie der Code oben

Wenn die Matrix das Gleiche macht, muss es an was anderem liegen.

Könnte es nicht sein, dass Blender das VertexBlending eingeschaltet hat? Dabei interpoliert er zwischen den Quaternionen der einzelnen Gelenke, damit die Gelenke natürlicher aussehen. Aber bitte berücksichtige dabei, dass ich mich mit Blender nicht auskenne.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 16, 2009 22:13 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ja, das die Matrix das selbe Ergebnis liefert, legt die Vermutung nahe das beides richtig funktioniert (wie es ja auch sollte). Die Wahrscheinlichkeit das beides gleich falsch funktioniert ist wohl relativ gering.
Mit den Vertices hab' ich keine Probleme (noch). Der Fehler betrifft eigentlich schon die Bones. Die haben ja auch einen Anfang und ein Ende. Also das Ende wird mit dem Quaternion um den Anfang rotiert. Oder der Richtungsvektor vom Anfang zum Ende wird rotiert.

Hm, mir ist noch was anderes eingefallen. Könnte sein das Rundungsfehler das ganze verfälschen. Ich benutze nur Single-Typen und manche Werte sind relativ nah an der Null. Muss ich mal testen.

Edit: Naja, ich hab' testweise mal alle Singles durch Doubles ersetzt. Hat leider nichts geändert.

Ich hab' hier mal ein paar Testwerte:

Quaternion = (0.9943 | -0.037621 | -0.099685 | 0.003918)
Untransformierter Richtungsvector = (0 | -0.000229 | 0.156257)
Transformierter Vector in Blender = (-0.000045 | 0.011584 | 0.1555827)
Transformierter Vector mein Programm = (-0.03102 | 0.0113397 | 0.152727)

Also vielleicht könnte das jemand nachrechnen. Oder hat noch jemand eine Idee warum die Werte unterschiedlich sind?


Zuletzt geändert von Schläfer am Do Jul 16, 2009 22:35, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 16, 2009 22:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Könntest Du den Fehler mal beschreiben, also ich meine, wie unterscheidet sich die Ansicht, wenn Du es selbst zeichnest, zur Ansicht von Blender?

Ich hatte z.B. mal den Fehler, dass ich die Rotationsachsen der Gelenke (ich hab das damals nur mit Matrizen gemacht) nicht normalisiert habe, daraufhin wurden die Bones skaliert, was sich so ausgewirkt hat, dass z.B. ein Unterarm sich zu ungeheuren Ausmassen vergrößert hat. :?



EDIT: Ich habe dazu etwas gefunden:

1. http://tentacolor.com/2007/05/04/project-animation-export-from-blender-in-progress/
und ein Update dazu:

2.http://tentacolor.com/2007/12/17/project-animation-export-from-blender-update/

Vielleicht hilft Dir das etwas.


EDIT2: Ich werde versuchen es nachzurechnen, aber erst morgen. Um diese Zeit bin ich schon außer Betrieb, was das Rechnen anbelangt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 17, 2009 01:04 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich hab' grad nochmal ein bischen bei Blender rumprobiert. Offensichtlich stimmt meine Rechnung mit den Quaternionen tatsächlich. Wenn ich bei Blender "manuell" den Vektor mit dem Quaternion verrechne, kommt das gleiche wie bei meinem Programm raus. Was ich aber nicht verstehe, ist wie sich Blender ansonsten die Bonepositionen zusammenbastelt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 17, 2009 07:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich zitiere aus meinem obigen zweiten Link:

Zitat:
As mentioned in my earlier post, the axes of rotation for the bones in the SL skeleton differ from the Blender skeleton. That is, in the Blender skeleton, the Y axis always points along the length of the bone. In the SL skeleton, it varies between bones.

Auf Deutsch:
Zitat:
Wie ich in meinem früheren Post erwähnt habe, unterscheidet sich die Rotationsachse im SL Skelett (?) vom Blender Skeleton. DAS KOMMT DAHER, DASS IN BLENDER DIE Y-ACHSE IMMER IN DIE RICHTUNG DES BONES ZEIGT. Im SL Skelett ist es unterschiedlich je nach Bone.


Das bedeutet, dass das Bone eine eigene Basis hat, sprich, dass man sich hier in einem verdrehten Koordinatensystem befindet, jedenfalls nicht im Weltkoordinatensystem. Wenn ich das jetzt logisch weiterverfolge, heißt das, dass Du zwar richtig gerechnet hast, aber von einem falschen Vektor (Bone) ausgehst.

Um da jetzt genau draufzukommen müsste man eine Rückrechnung durchführen, soll heißen: Du hast das Ergebnis in Blender, Du hast das Quaternion, und rückrechnen müsste jetzt heißen:

InputVektor = (Ergebnisvektor gemäß Blender) * (inverses Quaternion)

Wobei der Inputvektor das unrotierte Bone ist.

Der oben zitierte Thread ist zwei Jahre alt. Ich wette, das Blender das in der Zwischenzeit nicht geändert hat.

Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 17, 2009 16:26 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich hab' mich noch ein bischen mit den Matrizen die Blender noch zur Verfügung stellt, auseinander gesetzt.
zB gibt es eine Matrix die sich "localMatrix" nennt. Wenn ich die Objektkoordinaten des Endes eines Bones mit selbiger multipliziere, bekomme ich die transformierten Objektkoordinaten wie sie von Blender auch sonst ausgegeben werden. Das tolle ist, man kann sich die Rotation aus einer Matrix auch gleich in ein Quaternion umwandeln lassen. Das Ergebnis von genannter Matrix ist aber nicht so ganz das Quaternion was ich bisher verwendet habe. y und z sind vertauscht einer der Werte ist negiert. Ich nehme mal an das kommt daher das bei Blender die Z-Achse nach oben und Y in den Bildschirm rein zeigt.

Jedenfalls scheint mein Problem damit erstmal gelöst.

Edit: Hab' mich wohl zu früh gefreut, die Animation sieht zwar schon richtiger aus, aber immer noch nicht so wie in Blender.

Edit2: OK, jetzt sieht es so aus als ob es wirklich stimmen würde. Hat einige Zeit und Nerven gebraucht.
Code:
  1.  
  2. quat=Blender.Mathutils.DifferenceQuats(bone.parent.localMatrix.toQuat(),bone.localMatrix.toQuat())
  3.  

"quat" ist jetzt mein Quaternion was ich exportierte. Weil "localMatrix" im Armature-Space transformiert (und nicht im Bone-Space wie man vielleicht denken könnte) sind die Quaternionen daraus auch irgendwie global. Das hätte vielleicht auch einige Vorteile, verträgt sich aber nicht mit dem Bonesystem wie ich es benutze. Deshalb wird mit der Funktion "DifferenceQuats" der Teil der Transformation der durch das Parent verursacht wird einfach "raussubtrahiert".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 18, 2009 16:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Toll. Leute, die aus Blender eine skeletale Animation herausholen können, sind rar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 20:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hey, wenn du willst kannst du mal in den Restless Exporter gucken, da werden ebenfalls die Blender Armature und Bones als Quaterionen exportiert.

Edit: Sehe gerade, dass der Thread ja steinalt ist. :roll:

_________________
http://texelviews.delphigl.com


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 » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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 ]