在两个模型视图矩阵之间插值

时间:2013-04-06 21:39:06

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

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

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

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

如果我理解正确,这里newTranslation与模型视图矩阵的3x1平移组件不同,但是是相机的世界空间位置。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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'矩阵,我们在"身份" 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结果。

(如果您不知道如何执行此操作,请在google上搜索,那里有一堆血统资源,这样做很简单)

这给了我们结果:

{
    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'没有什么特别的。矩阵的值,它只是将它们添加为位置偏移,因此,对它们进行线性插值将导致摄像机的线性位置移动。