【问题标题】:three.js - Quaternions for rotation matrix of a mesh in relation to the camera when that mesh has a parent?three.js - 当网格有父级时,网格相对于相机的旋转矩阵的四元数?
【发布时间】:2016-07-04 06:25:26
【问题描述】:

通过跟踪系统,我可以访问与相机相关的颈部 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 度。 当旋转与父级相关时,如何应用旋转 wrt 相机?

谢谢

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

【问题讨论】:

  • 我们不需要知道创建 NeckWRTCameraMatrix 的语句吗?
  • 这是一个 4x4 矩阵,表示颈部相对于相机的变换

标签: matrix three.js rotation quaternions


【解决方案1】:

经过研究,我以这种方式到达那里,可能会帮助有四元数问题的人:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2019-06-29
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多