【问题标题】:Interpolate between two modelview matrices在两个模型视图矩阵之间进行插值
【发布时间】:2013-03-29 04:34:46
【问题描述】:

在 OpenGL 中,给定两个相机位置(即模型视图矩阵),我想在它们之间平滑过渡。也就是说,我想在两个模型视图矩阵之间进行插值。我看过很多关于使用 SLERP 在两个旋转矩阵之间进行插值的资源,但是对于相机位置,我们也有一个平移组件。 这样做是否像使用 SLERP 用于 3x3 旋转矩阵和使用 LERP 用于模型视图矩阵的 3x1 平移组件一样简单? 我的直觉告诉我,它可能没有这么简单,因为 3x1 平移组件不是相机的世界空间位置,对吧?

如果我有每个相机位置的实际世界位置,我想我可以将这些步骤分解为两个 OpenGL 命令:

glMultMatrix(newRotation); // rotation using SLERP
glMultMatrix(newTranslation); // translation using LERP

如果我理解正确的话,这里的newTranslation并不是模型视图矩阵的3x1平移分量,而是相机的世界空间位置。

【问题讨论】:

标签: opengl rotation translation model-view linear-interpolation


【解决方案1】:

为什么不在相机位置/目标之间进行插值?

startPos = x
endPos = y
startTarget = xx
endTarget = yy

update()

currentPos = interpolate(startPos, endPos, time_param);
currentTarget = interpolate(startTarget, endTarget, time_param);

camera_matrix = lookAt(currentPos, targetPos, upVector);

我认为这种方式更容易控制摄像机的移动。

这里有更高级的插值方法:http://sol.gfxile.net/interpolation/

【讨论】:

  • 听起来不错。但是,我只有开始和结束模型视图矩阵,所以我想我可以通过将 3x1 平移分量乘以 3x3 旋转分量的转置来提取位置。然后根据模型视图矩阵的位置和3rd column,我可以创建目标开始和结束位置。但是我必须使用 SLERP 来插入 both 目标位置和向上向量...对吗?
  • 对于向量,您可以使用“正常”插值。线性开始就足够了。以下是更高级的插值方法:sol.gfxile.net/interpolation
【解决方案2】:

线性变换对于“3x1”部分是正确的,要弄清楚原因,让我们深入研究矩阵变换函数。


假设我们有模型视图矩阵:

{ a, b, c, 
  d, e, f,
  g, h, i,
  x, y, z }

Where a->i is our 3x3 rotation/scale component
and x->z is the "3x1" part you were talking about.

让我们使用顶点位置:{ A, B, C }

关于这些矩阵/向量需要注意的一点是,它们实际上是“4x4”和“4x1”矩阵的简写,我们用“identity”值代替 4x4 的缺失部分,而用“1”代替4x1 的最后一个值。

这意味着我们的实际工作值是:

{ a, b, c, 0, 
  d, e, f, 0,
  g, h, i, 0,
  x, y, z, 1 }

and
{ A, B, C, 1 }

现在我们已经有了很好的匹配矩阵维度,我们可以应用我们的4x4 * 4x1 矩阵乘法运算,这将给我们一个4x1 结果。

(如果你不知道怎么做,去谷歌搜索,有一大堆血统资源,做起来很简单)

这给了我们结果:

{
    A*a + B*d + C*g + 1*x,
    A*b + B*e + C*h + 1*y,
    A*c + B*f + C*i + 1*z,
    A*0 + B*0 + C*0 + 1*1,
}
or (simplified):
{
    A*a + B*d + C*g + x,
    A*b + B*e + C*h + y,
    A*c + B*f + C*i + z,
    1,
}

请注意,每个组件都只是添加了xyz,并且这些值不会以任何其他方式使用。

对矩阵的 '3x1' 值没有做任何特殊处理,它只是将它们添加为位置偏移量,因此,对它们进行线性插值将导致“相机”的线性位置移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多