我在一个4x4的变换矩阵中存储了一个物体在3D空间中的位置。现在,为了将物体从矩阵A中存储的位置移动到矩阵B中存储的位置,我想要对它们进行插值。
那么我只需要插值矩阵中的16个值吗?或者我需要特别注意些什么吗?
谢谢!
我在一个4x4的变换矩阵中存储了一个物体在3D空间中的位置。现在,为了将物体从矩阵A中存储的位置移动到矩阵B中存储的位置,我想要对它们进行插值。
那么我只需要插值矩阵中的16个值吗?或者我需要特别注意些什么吗?
谢谢!
让我重新表述您的问题:
您需要在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的论文用四元数曲线动画旋转。仅仅对矩阵值进行插值可能不能满足您的要求,除非您只进行非常简单的变换(例如平移或缩放)。
我认为有一些方法可以将矩阵分解为平移、旋转、缩放等,并且然后您可以基于这些参数构建新的矩阵进行插值。
您也可以进行转换前后的变换,然后线性插值对象的顶点。但是这种方法可能也无法满足您的需求。
在WebKit项目中可以找到用于转换矩阵插值的源代码,该代码具有没有限制的许可证。请查看名为'blend'的函数,它们用于创建插值矩阵:
所有文件,包括头文件,都可以在所属目录找到。
但是我刚刚尝试了二维仿射代码,发现在旋转之间进行插值时无法保留旋转中心。所以现在我不太确定它是否有用。