3d几何:如何插入矩阵

cla*_*amp 16 geometry interpolation matrix

我将物体的位置存储在4by4变换矩阵中的3d空间中.现在,为了将对象从存储在矩阵A中的位置移动到存储在矩阵B中的位置,我想插入它们.

所以我只是通过插入矩阵中的16个值中的每一个来做到这一点,或者我是否必须特别注意某些事情?

谢谢!

bra*_*jam 18

看看Ken Shoemake和Tom Duff的矩阵动画和极地分解 .基本思想是将转换矩阵分解为有意义的组件,如拉伸,旋转和平移,然后插入这些组件.


Vic*_*Liu 15

如果插入矩阵的所有16个条目,结果将看起来很奇怪,因为插值矩阵不是刚性变换(您将得到偏斜和体积变形).正确的做法是分离平移和旋转/缩放,为您提供平移向量T和3x3旋转矩阵R(这只适用于假设您的原始4x4表示刚性变换).然后对3x3 R = Q'DQ进行特征值分解(tick表示转置),给出正交Q和对角线缩放D.现在你线性插值T和D,同时你slerp Q的列,然后你重新组装矩阵.


Hel*_*ang 5

让我重新表述你的问题:

您需要在 R0 和 R1 之间进行插值。

并提议这样做:

Ri = aR0 + (1-a)R1

正如维克多在他/她的回答中提到的那样,它不会很好用:你会得到歪斜和体积变形。

在数学上(在 3d 几何上下文中),加法没有多大意义:添加两个平移矩阵意味着什么?

一个既定的解决方案是插入为:

Ri = (R1*(inverse(R0)))^a*R0

我们将 R^a 定义为一个操作,它使我们围绕向量 [kx, ky, kz] 旋转 a*theta 度。

所以当 a = 0 时,Ri = R0;当 a = 1 时,Ri = R1。这使得基于乘法的插值在 3d 几何环境中更加自然。

现在是如何表示操作 R^a 的难点。事实证明,使用R 的四元数表示允许我们表示操作 R^a。基于 Ken Shoemake 的纸动画旋转与四元数曲线


tfi*_*iga 4

仅对矩阵值进行插值可能不会给您带来想要的结果,除非您只进行非常简单的转换(例如平移或缩放)。

我认为有一些方法可以将矩阵分解为平移、旋转、缩放等,然后您可以构建基于这些参数进行插值的新矩阵。

您也可以只进行前后变换,然后对对象的顶点进行 lerp。这也可能不会给您想要的结果。