3D几何学:如何插值矩阵

23

我在一个4x4的变换矩阵中存储了一个物体在3D空间中的位置。现在,为了将物体从矩阵A中存储的位置移动到矩阵B中存储的位置,我想要对它们进行插值。

那么我只需要插值矩阵中的16个值吗?或者我需要特别注意些什么吗?

谢谢!


1
你如何在变换矩阵中存储物体的“位置”?这是相机吗?需要更多信息。 - Jacob
6个回答

20

请查看Ken Shoemake和Tom Duff的《矩阵动画和极分解》。 基本思路是将变换矩阵分解为有意义的组件,如拉伸、旋转和平移,然后进行插值。


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

7

让我重新表述您的问题:

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

并且提议使用以下方式进行:

Ri = aR0 + (1-a)R1

这样做效果不好,正如Victor在他/她的回答中所提到的:您将得到扭曲和体积变形。

在数学上(在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的论文用四元数曲线动画旋转

4

仅仅对矩阵值进行插值可能不能满足您的要求,除非您只进行非常简单的变换(例如平移或缩放)。

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

您也可以进行转换前后的变换,然后线性插值对象的顶点。但是这种方法可能也无法满足您的需求。


4
我假设你的问题是这样的:你有一个对象x,你对它应用了一个线性变换A得到了Ax,现在你想将它转换成另一个变换B所得到的位置,即从Ax转换到Bx
假设A可逆矩阵,只需应用BA-1即可得到BA-1(Ax)=Bx [编辑]由于你提到了移动,你可能是在谈论一个仿射变换(线性变换后跟随一个平移)。如果是这种情况,你要将Ax + C移动到Bx + D
为此,需要减去C(即将对象移动到原点),应用BA-1,然后添加D
(BA-1((Ax + C) - C)) + D = Bx + D

0

在WebKit项目中可以找到用于转换矩阵插值的源代码,该代码具有没有限制的许可证。请查看名为'blend'的函数,它们用于创建插值矩阵:

用于通用4 x 4矩阵

用于2D图形中使用的六元素仿射变换

所有文件,包括头文件,都可以在所属目录找到。

但是我刚刚尝试了二维仿射代码,发现在旋转之间进行插值时无法保留旋转中心。所以现在我不太确定它是否有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接