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

Opengl 在两个模型视图矩阵之间插值,opengl,rotation,translation,model-view,linear-interpolation,Opengl,Rotation,Translation,Model View,Linear Interpolation,在OpenGL中,给定两个摄影机位置(即模型视图矩阵),我希望在它们之间平滑过渡。也就是说,我想在两个modelview矩阵之间插值。我已经看过很多关于使用SLERP在两个旋转矩阵之间插值的参考资料,但是对于摄影机位置,我们也有一个平移组件这样做是否像对3x3旋转矩阵使用SLERP和对模型视图矩阵的3x1平移组件使用LERP一样简单?我的直觉告诉我,可能不是这么简单,因为3x1平移组件不是相机的世界空间位置,对吗 如果我有每个摄影机位置的实际世界位置,我想我可以将这些步骤分解为两个OpenGL命

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

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

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

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

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

startPos = x
endPos = y
startTarget = xx
endTarget = yy
update()中

我认为用这种方式控制摄像机的运动更简单


这里有更高级的插值方法:

线性变换对于“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
结果

(如果你不知道怎么做,可以在谷歌上搜索,那里有大量的下降资源,而且做起来相当简单)

这给了我们一个结果:

{
    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
y
z
,这些值不会以任何其他方式使用


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

可能的复制仅与旋转有关,但是上面的答案提到了对非旋转部分进行线性插值。我想我可以通过将3x1平移分量乘以3x3旋转分量的转置,然后对其进行线性插值来找到平移,这听起来很不错。但是,我只有开始和结束模型视图矩阵,所以我想我可以通过将3x1平移分量乘以3x3旋转分量的转置来提取位置。然后根据模型视图矩阵的位置和位置,我可以创建目标开始和结束位置。但是我必须使用SLERP来插值目标位置和上方向向量…对吗?对于向量,你可以使用“法线”插值。一开始线性就足够了。以下是更高级的插值方法:
{
    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,
}