【问题标题】:3d geometry: how to interpolate a matrix3d 几何:如何插值矩阵
【发布时间】:2011-03-06 19:50:28
【问题描述】:

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

所以我只是通过对矩阵中的 16 个值中的每一个进行插值来做到这一点,还是我必须特别注意一些事情?

谢谢!

【问题讨论】:

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

标签: geometry matrix interpolation


【解决方案1】:

变换矩阵插值的源代码,无限制许可证,可以在WebKit项目中找到;查看名为“混合”的函数,它创建了一个插值矩阵:

for general 4 x 4 matrices

for six-element affine transforms used in 2D graphics

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

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

【讨论】:

    【解决方案2】:

    让我重新表述你的问题:

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

    并建议这样做:

    Ri = aR0 + (1-a)R1

    正如维克多在他/她的回答中提到的那样,它不会很好地工作:你会得到倾斜和体积变形。

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

    一个既定的解决方案是插值如下:

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

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

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

    现在是如何表示操作 R^a 的难点。事实证明,使用 R 的quaternion representation 可以表示操作 R^a。基于 Ken Shoemake 的论文animating rotation with quaternion curves

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        查看 Ken Shoemake 和 Tom Duff 的 Matrix Animation and Polar Decomposition 。基本思想是将变换矩阵分解为有意义的组件,例如拉伸、旋转和平移,然后对它们进行插值。

        【讨论】:

          【解决方案5】:

          我假设你要问的是,你有一个对象 x,你已经应用了一个 linear transformation A 来得到 斧头,现在您想对其进行变换,使其处于应用其他变换B 的位置,即。从 Ax 转换为 Bx

          假设Ainvertible,只需应用BA-1即可得到BA-1(斧头) = Bx

          [编辑]既然你提到了移动,你可能是在谈论affine transformation(一个线性变换,然后是一个平移)。如果是这种情况,您正在寻找搬家
          Ax + CBx + D

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

          【讨论】:

            【解决方案6】:

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

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

            你也可以只做一个前后变换,然后调整对象的顶点。这也可能不会给您想要的结果。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-09-06
              • 2013-06-23
              • 2018-05-08
              • 1970-01-01
              • 1970-01-01
              • 2020-05-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多