从跟踪系统我可以访问相对于相机的颈部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度。 当旋转与父对象相关时,如何应用旋转相位?
谢谢
编辑:所以我需要的是得到颈部相对于世界的旋转...相机旋转变换和我得到的矩阵之间的一些操作?
答案 0 :(得分:0)
经过研究,我就是这样做的,可以帮助有四元数问题的人:
从第一帧旋转矩阵中提取四元数并将其共轭以获得反向旋转。这将作为初始姿势四元数
initial_quaternion = new THREE.Quaternion();
initial_quaternion.setFromRotationMatrix(m);
initial_quaternion.conjugate();
对于提取四元数的每个帧和第一个四元数的乘以,所以我得到了两个四元数的组合旋转(是第一个反转的,那个共轭将给出初始轮换而不是总和的差异。因为我想要颈骨相对于头骨的旋转,这很有效。
var quaternion = new THREE.Quaternion();
quaternion.setFromRotationMatrix(m);
quaternion.multiply(initial_quaternion);
在这之后,由于头部和颈部运动的总旋转量为总运动的50%,我想给旋转一个 50%的重量。为此,通过结果四元数在2中插入一个中性姿势四元数,其中t = 0.5
var basicQuaternion = new THREE.Quaternion();
quaternion.slerp(basicQuaternion,0.5);
将四元数应用于颈部和头部骨骼(网格中的轴与作为输入的轴不同)。
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
);