three.js - 当网格具有父网格时,网格相对于相机的旋转矩阵的四元数?

时间:2016-06-12 23:28:30

标签: matrix three.js rotation quaternions

从跟踪系统我可以访问相对于相机的颈部4x4变换矩阵(NeckWRTCameraMatrix)。

我需要在three.js中设置颈部骨骼的动画,该颈部骨骼具有母骨另一种骨骼,但颈部的旋转方式与相机相关。

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

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

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

然而,这会使骨骼旋转180度。 当旋转与父对象相关时,如何应用旋转相位?

谢谢

编辑:所以我需要的是得到颈部相对于世界的旋转...相机旋转变换和我得到的矩阵之间的一些操作?

1 个答案:

答案 0 :(得分:0)

经过研究,我就是这样做的,可以帮助有四元数问题的人:

  1. 从第一帧旋转矩阵中提取四元数并将其共轭以获得反向旋转。这将作为初始姿势四元数

    initial_quaternion = new THREE.Quaternion();
    initial_quaternion.setFromRotationMatrix(m);
    initial_quaternion.conjugate();
    
  2. 对于提取四元数的每个帧和第一个四元数的乘以,所以我得到了两个四元数的组合旋转(是第一个反转的,那个共轭将给出初始轮换而不是总和的差异。因为我想要颈骨相对于头骨的旋转,这很有效。

    var quaternion = new THREE.Quaternion();  
    quaternion.setFromRotationMatrix(m);
    quaternion.multiply(initial_quaternion);
    
  3. 在这之后,由于头部和颈部运动的总旋转量为总运动的50%,我想给旋转一个 50%的重量。为此,通过结果四元数在2中插入一个中性姿势四元数,其中t = 0.5

    var basicQuaternion = new THREE.Quaternion();
    quaternion.slerp(basicQuaternion,0.5);
    
  4. 将四元数应用于颈部和头部骨骼(网格中的轴与作为输入的轴不同)。

    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
    );