2

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

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

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

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

4

2 回答 2

2

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

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/

于 2013-04-07T09:57:10.183 回答
0

线性变换对于“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,
}

请注意,每个组件都简单地具有或添加到它x,并且这些值不会以任何其他方式使用。yz

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

于 2014-07-07T05:28:38.173 回答