Three.js 在ThreeJS中,Object3D.ApplyMatrix X4不是连续的
我使用Object3D.ApplyMatrix X4用矩阵a变换一个对象,我发现在某一点上它没有保留特征向量的方向。Three.js 在ThreeJS中,Object3D.ApplyMatrix X4不是连续的,three.js,3d,linear-algebra,eigenvalue,eigenvector,Three.js,3d,Linear Algebra,Eigenvalue,Eigenvector,我使用Object3D.ApplyMatrix X4用矩阵a变换一个对象,我发现在某一点上它没有保留特征向量的方向。 所以我尝试在单位矩阵I和A之间设置插值动画,我发现: 这种转变怎么可能不是连续的呢 旋转矩阵的线性插值在数学上并不合理。构成旋转矩阵的向量需要为单位长度。。或者至少保持一致的长度 想象一个时钟,指针在12点,指针在6点。 如果将12点钟指针尖端的点线性插值到6点钟指针尖端,则该点沿直线从时钟顶部到底部移动 要插值4x4矩阵表示的旋转,可以将矩阵的旋转转换为四元数,并在这些四元数
所以我尝试在单位矩阵
I
和A
之间设置插值动画,我发现:
这种转变怎么可能不是连续的呢 旋转矩阵的线性插值在数学上并不合理。构成旋转矩阵的向量需要为单位长度。。或者至少保持一致的长度 想象一个时钟,指针在12点,指针在6点。 如果将12点钟指针尖端的点线性插值到6点钟指针尖端,则该点沿直线从时钟顶部到底部移动 要插值4x4矩阵表示的旋转,可以将矩阵的旋转转换为四元数,并在这些四元数之间转换为.slerp(球面线性插值),然后再转换回矩阵 然后对object.position进行线性插值。(尽管如此..这假设关键帧之间存在线性运动)
现在,在旋转很小的情况下,可以对矩阵进行线性插值,但需要在每一步对其进行正交规格化,以将网格重塑为具有相互正交的一致长度向量的网格。那并不难。。您可以使用点积、乘和加向量的组合来形成矩阵行(或列,我忘了)来正交化矩阵。但这比仅仅使用四元数和.slerp更痛苦,更不准确。旋转矩阵的线性插值在数学上并不合理。构成旋转矩阵的向量需要为单位长度。。或者至少保持一致的长度 想象一个时钟,指针在12点,指针在6点。 如果将12点钟指针尖端的点线性插值到6点钟指针尖端,则该点沿直线从时钟顶部到底部移动 要插值4x4矩阵表示的旋转,可以将矩阵的旋转转换为四元数,并在这些四元数之间转换为.slerp(球面线性插值),然后再转换回矩阵 然后对object.position进行线性插值。(尽管如此..这假设关键帧之间存在线性运动)
现在,在旋转很小的情况下,可以对矩阵进行线性插值,但需要在每一步对其进行正交规格化,以将网格重塑为具有相互正交的一致长度向量的网格。那并不难。。您可以使用点积、乘和加向量的组合来形成矩阵行(或列,我忘了)来正交化矩阵。但这更痛苦,而且比仅仅使用四元数和.slerp更不准确。@manthrax的回答指出了线性插值矩阵的基本问题,而我当时并不知道,他是对的。但真正的问题是
Object3D.applyMatrix4
不是明确定义局部矩阵的正确函数。我试着直接设置Object3D.matrix
属性,结果成功了。线性插值(虽然我不应该这样做)变得连续。@manthrax的回答指出了线性插值矩阵的基本问题,而我当时并不知道,他是对的。但真正的问题是Object3D.applyMatrix4
不是明确定义局部矩阵的正确函数。我试着直接设置Object3D.matrix
属性,结果成功了。线性插值(虽然我不应该这样做)变得连续