我将对象的位置存储在4by4变换矩阵中的3d空间中。 现在为了将对象从存储在矩阵A中的位置移动到存储在矩阵B中的位置,我想插入它们。
所以我只是通过插入矩阵中的16个值中的每一个来做到这一点,或者我是否必须特别注意某些事情?
谢谢!
答案 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 six-element affine transforms used in 2D graphics
所有文件(包括标题)都可以在enclosing directory中找到。
但是我刚刚尝试了2D仿射代码,并且在旋转之间进行插补时,它不保留旋转中心。所以我现在不确定它是否有用。