3d几何:如何插入矩阵

时间:2010-06-22 13:20:00

标签: geometry matrix interpolation

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

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

谢谢!

6 个答案:

答案 0 :(得分:18)

查看Ken Shoemake和Tom Duff的Matrix Animation and Polar Decomposition 。基本思想是将转换矩阵分解为有意义的组件,如拉伸,旋转和平移,然后插入这些组件。

答案 1 :(得分:15)

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

答案 2 :(得分:5)

我假设你问的是,你有一个对象 x ,你已经应用linear transformation A 来获取< strong> Ax ,现在你想要对它进行转换,如果你应用了其他转换 B 即它将处于 所处的位置。从 Ax 转换为 Bx

假设 A invertible,只需应用 BA -1 即可获得 BA -1 < / sup>(Ax) = Bx

[编辑] 由于您提到移动,您可能会谈论affine transformation (线性转换后跟翻译)。如果是这种情况,您希望移动
Ax + C Bx + D

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

答案 3 :(得分:4)

只是插入矩阵值可能无法提供您想要的内容,除非您只进行非常简单的转换(例如,平移或缩放)。

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

您也可以在转换前后进行转换,然后对对象的顶点进行lerp。这也可能无法为您提供您所追求的结果。

答案 4 :(得分:4)

让我重新提一下你的问题:

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

并建议将其作为:

  

Ri = aR0 +(1-a)R1

它不会很好,正如胜利者在他/她的回答中提到的那样:你会出现扭曲和体积变形。

在数学上(在三维几何上下文中),加法没有多大意义:添加两个平移矩阵是什么意思?

已建立的解决方案是插值为:

  

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

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

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

现在很难如何表示操作R ^ a。结果使用R的quaternion representation允许我们表示操作R ^ a。基于Ken Shoemake的论文animating rotation with quaternion curves

答案 5 :(得分:0)

可以在WebKit项目中找到具有无限制许可的用于变换矩阵插值的源代码;请参阅称为“混合”的函数,它们会创建一个插值矩阵:

for general 4 x 4 matrices

for six-element affine transforms used in 2D graphics

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

但是我刚刚尝试了2D仿射代码,并且在旋转之间进行插补时,它不保留旋转中心。所以我现在不确定它是否有用。