在OpenGL中,给定两个摄像机位置(即模型视图矩阵),我希望它们之间能顺利过渡。也就是说,我想在两个模型视图矩阵之间进行插值。我看到了很多关于使用SLERP在两个旋转矩阵之间插值的资源,但是对于摄像机位置,我们也有一个平移组件。这样做很简单,就像对3x3旋转矩阵使用SLERP,对模型视图矩阵的3x1转换组件使用LERP ?我的直觉告诉我,可能不是这么简单,因为3x1翻译组件不是相机的世界空间位置,对吗?
如果我有每个摄像机位置的实际世界位置,我想我可以将这些步骤分解为两个OpenGL命令:
glMultMatrix(newRotation); // rotation using SLERP
glMultMatrix(newTranslation); // translation using LERP如果我正确理解的话,在这里,newTranslation不是模型视图矩阵的3x1转换组件,而是相机的世界空间位置。
发布于 2013-04-07 09:57:10
为什么不在摄像机位置/目标之间插入?
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/
发布于 2014-07-07 05:28:38
对于'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‘值没有什么特殊的处理,它只是将它们添加为位置偏移量,因此,对它们进行线性插值将导致“摄像机”的线性位置运动。
https://stackoverflow.com/questions/15856329
复制相似问题