2016-06-12 20 views
0

Von einem Tracking-System habe ich Zugang zu einer Hals 4x4 Transformationsmatrix in Bezug auf die Kamera (NeckWRTCameraMatrix).three.js - Quaternions für die Rotationsmatrix eines Gitters in Bezug auf die Kamera, wenn dieses Gitter ein Elternteil hat?

Ich muss in drei.js den Hals Knochen animieren, der als Elternteil andere Knochen hat, aber in einer Weise, dass die Rotation des Halses in Bezug auf die Kamera ist.

var m = new THREE.Matrix4(); 
m.fromArray(NeckWRTCameraMatrix); 

var quaternion = new THREE.Quaternion(); 
quaternion.setFromRotationMatrix(m); 

head.boneByName("Joint_Neck").quaternion.copy(quaternion); 

Allerdings dreht dies den Knochen in 180 Grad. Wie wende ich die Rotation mit der Kamera an, da die Rotationen in Relation zum Elternteil stehen?

Danke

EDIT: Also wahrscheinlich das, was ich brauche, ist die Drehung des Halses WRT Kamera in Bezug auf die Welt zwischen der Kameradrehung einige Transformations-Operation .. erhalten und die Matrix ich habe?

+0

Sie nicht benötigen wir die Aussage wissen, dass NeckWRTCameraMatrix schafft? – dcromley

+0

Es ist eine 4x4 Matrix, die die Transformation des Halses in Bezug auf die Kamera darstellt –

Antwort

0

Nach der Erforschung ich sich auf diese Weise bekam, könnte jemand mit quaternion Problemen helfen:

  1. Heraus quaternion aus der ersten Bildrotationsmatrix und konjugiert es die inverse Drehrichtung zu erhalten. Dies funktioniert als Anfang Pose Quaternion

    initial_quaternion = new THREE.Quaternion(); 
    initial_quaternion.setFromRotationMatrix(m); 
    initial_quaternion.conjugate(); 
    
  2. Für jeden Rahmen der Quaternion extrahierten und multipliziert zur ersten Quaternion, so dass ich die bestehend Drehung beiden Quaternionen (wobei die erste invertierte, dass die Konjugation wird die Differenz von der anfänglichen Rotation anstelle der Summe geben). Da ich die Rotation des Nackenknochens in Relation zum Kopfbein wollte, funktioniert das großartig.

    var quaternion = new THREE.Quaternion(); 
    quaternion.setFromRotationMatrix(m); 
    quaternion.multiply(initial_quaternion); 
    
  3. Danach hat, wie der Kopf und Hals Bewegung haben eine zusammengesetzte Rotation von 50% der Gesamtbewegung, I einem 50% Gewicht der Drehung geben wollte. Derjenigen, interpoliert eine neutrale Quaternion durch die resultierten Quaternion in 2 mit t-Pose = 0,5

    var basicQuaternion = new THREE.Quaternion(); 
    quaternion.slerp(basicQuaternion,0.5); 
    
  4. angewendet, die Quaternion auf beide Hals und Kopf Knochen (Achse in die Maschen von denen als Eingabe verschieden sind) .

    head.boneByName("Joint_Head").quaternion.set(
         quaternion.y, 
         quaternion.z, 
         quaternion.x, 
         quaternion.w 
    ); 
    
    head.boneByName("Joint_Neck").quaternion.set(
         quaternion.y, 
         quaternion.z, 
         quaternion.x, 
         quaternion.w 
    );