在OpenGL中,给定两个摄像机位置(即模型视图矩阵),我想在它们之间平滑过渡。也就是说,我想在两个模型视图矩阵之间进行插值。我已经看到许多资源谈论使用SLERP在两个旋转矩阵之间进行插值,但是对于摄像机位置,我们也有一个平移组件。 对于3x3旋转矩阵使用SLERP和使用LERP作为模型视图矩阵的3x1平移组件这么简单吗?我的直觉告诉我它可能不是这么简单,因为3x1翻译组件不是相机的世界空间位置,对吗?
如果我拥有每个摄像机位置的实际世界位置,我想我可以将这些步骤分解为两个OpenGL命令:
glMultMatrix(newRotation); // rotation using SLERP
glMultMatrix(newTranslation); // translation using LERP
如果我理解正确,这里newTranslation与模型视图矩阵的3x1平移组件不同,但是是相机的世界空间位置。
答案 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,
}
请注意,每个组件只添加了x
,y
或z
,并且这些值不会以任何其他方式使用。
' 3x1'没有什么特别的。矩阵的值,它只是将它们添加为位置偏移,因此,对它们进行线性插值将导致摄像机的线性位置移动。