Geometry 三维几何体:如何插值矩阵

Geometry 三维几何体:如何插值矩阵,geometry,matrix,interpolation,Geometry,Matrix,Interpolation,我将对象在三维空间中的位置存储在4by4变换矩阵中。 现在,为了将对象从存储在矩阵A中的位置移动到存储在矩阵B中的位置,我想对它们进行插值 那么,我是通过插值矩阵中16个值中的每一个来实现这一点,还是需要特别注意一些事情 谢谢 仅对矩阵值进行插值可能无法满足您的需要,除非您只进行非常简单的变换(例如,平移或缩放) 我认为有一些方法可以将矩阵分解为平移、旋转、缩放等,然后您可以构建基于这些参数进行插值的新矩阵 您也可以在变换前后进行一次,然后对对象的顶点进行lerp。这也可能不会给你想要的结果。我

我将对象在三维空间中的位置存储在4by4变换矩阵中。 现在,为了将对象从存储在矩阵A中的位置移动到存储在矩阵B中的位置,我想对它们进行插值

那么,我是通过插值矩阵中16个值中的每一个来实现这一点,还是需要特别注意一些事情


谢谢

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

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


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

我想你问的是,你有一个对象x,你对它应用了a,得到Ax,现在,您希望对其进行变换,使其处于应用其他变换时的位置,即从Ax变换为Bx

假设A为,只需应用BA-1即可获得BA-1(Ax)=Bx

[Edit]既然您提到了移动,那么您可能会说的是一个(线性变换,然后是平移)。如果是这种情况,您希望搬家
Ax+CBx+D

为此,减去C(即将对象移动到原点),应用BA-1,然后添加D

(BA-1((Ax+C)-C))+D=Bx+D

看看肯·舒梅克和汤姆·达夫的书。基本思想是将变换矩阵分解为有意义的组件,如拉伸、旋转和平移,然后对这些组件进行插值。

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

让我重新表述您的问题:

您需要在R0和R1之间插值

并建议这样做:

Ri=aR0+(1-a)R1

正如victor在其回答中提到的那样,它不会很好地工作:您将得到倾斜和体积变形

数学上(在三维几何环境中),加法没有多大意义:两个平移矩阵相加意味着什么

确定的解决方案是插值为:

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

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

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


现在,如何表示运算R^a的困难部分。事实证明,使用R可以表示运算R^a。基于Ken Shoemake的论文

变换矩阵插值的源代码,具有非限制性许可证,可以在WebKit项目中找到;请参阅名为“blend”的函数,该函数创建插值矩阵:

所有文件(包括标题)都可以在中找到

但我刚刚尝试过2D仿射代码,在旋转之间插值时它不会保留旋转中心。因此我现在不确定它是否有用。

如何将对象的“位置”存储在变换矩阵中?这是相机吗?需要更多信息。