这与LookAt目标位置无关,如果它是z = 0或z = 1000或-1000?
我试过了
gluLookAt(512, 384, 2000,
512, 384, 0,
0.0f, 1.0f, 0.0f);
Run Code Online (Sandbox Code Playgroud)
并且工作正常,现在我将第3行(UP向量),最后一个数字更改为0.8:
gluLookAt(512, 384, 2000,
512, 384, 0,
0.0f, 1.0f, 0.8f);
Run Code Online (Sandbox Code Playgroud)
它完全相同...接下来我尝试并修改了第3行,第一个数字为0.8:
gluLookAt(512, 384, 2000,
512, 384, 0,
0.8f, 1.0f, 0.8f);
Run Code Online (Sandbox Code Playgroud)
现在视图就像向左旋转了45度.这个UP向量如何工作?
Cap*_*uff 30
向上矢量用于创建提供给gluLookAt的眼睛和中心矢量之间的叉积.
从iOS上的GLKit标头,您可以看到实现为:
static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
{
GLKVector3 ev = { eyeX, eyeY, eyeZ };
GLKVector3 cv = { centerX, centerY, centerZ };
GLKVector3 uv = { upX, upY, upZ };
GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));
GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n));
GLKVector3 v = GLKVector3CrossProduct(n, u);
GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f,
u.v[1], v.v[1], n.v[1], 0.0f,
u.v[2], v.v[2], n.v[2], 0.0f,
GLKVector3DotProduct(GLKVector3Negate(u), ev),
GLKVector3DotProduct(GLKVector3Negate(v), ev),
GLKVector3DotProduct(GLKVector3Negate(n), ev),
1.0f };
return m;
}
Run Code Online (Sandbox Code Playgroud)
此问题中接受的答案如何正确使用gluLookAt?提供了向上矢量实际影响的内容的良好描述.
(gluLookAt中"up"向量背后的直觉很简单:看看任何东西.现在将你的头部倾斜90度.你没有改变的地方,你所看到的方向没有改变,但是你的形象是视网膜显然有.有什么不同?头顶指向的位置.这是向上的向量.)
Cod*_*Hxr 21
向上矢量确定哪个方向是"向上".把它想象成一个摄像机...如果你"正确地"拿着相机,那么从摄像机中心向上到相机顶部的假想线可以用矢量(0,1,0)表示.如果将摄像机向右倾斜45度,则从摄像机中心到摄像机"顶部"的假想线现在将由新矢量(1,1,0)表示.如果你稍后向后倾斜相机,你的"向上"矢量现在变为(1,1,1)[或(1,1,-1)...我总是得到z轴的极性逆转.
因此,简而言之,UP向量通过说明相机的方向中哪个点"向上"来描述相机的滚动.
希望有所帮助.:)
(根据评论编辑以更正摘要)
gluLookAt的前两个参数是摄像机位置和摄像机目标.只有这两个相机没有完全约束.想象一下站在拿着相机的地方.您可以水平握住相机拍摄风景照片,也可以垂直握住相机拍摄人像照片.在这两种情况下,相机的位置和图片主题的位置是相同的.您可以将相机旋转到任何角度,这两个值不会改变.第三个参数,向上矢量,选择摄像机的方向.