这与 LookAt 目标位置是 z = 0 还是 z = 1000 或 -1000 无关紧要?
我试过了
gluLookAt(512, 384, 2000,
512, 384, 0,
0.0f, 1.0f, 0.0f);
一切正常,现在我将第 3 行(UP 向量(,最后一个数字更改为 0.8
:
gluLookAt(512, 384, 2000,
512, 384, 0,
0.0f, 1.0f, 0.8f);
而且完全一样... 接下来我尝试并修改了第 3 行,第一个要0.8
的数字:
gluLookAt(512, 384, 2000,
512, 384, 0,
0.8f, 1.0f, 0.8f);
现在视图就像向左旋转了 45 度。 这个UP载体是如何工作的?
向上向量用于在提供给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;
}
这个问题中公认的答案 如何正确使用 gluLookAt?很好地描述了向上向量的实际影响。
(gluLookAt中"向上"向量背后的直觉很简单:看任何东西。现在将头部倾斜 90 度。你所在的位置没有改变,你看的方向没有改变,但你视网膜中的图像显然改变了。有什么区别?你的头顶指向的地方。这是向上向量。
向上向量确定哪个方向是"向上"。 把它想象成一个摄像机...如果您"正确"握住相机,那么从相机中心向上到相机顶部的假想线可以用矢量 (0,1,0( 表示。 如果将相机向右倾斜 45 度,则从相机中心到相机"顶部"的假想线现在将由新矢量 (1,1,0( 表示。 如果您然后将相机"向后"倾斜一点,您的"向上"矢量现在变为 (1,1,1( [或 (1,1,-1(...我总是把z轴的极性颠倒过来]。
因此,简而言之,UP矢量通过说出相机方向上的哪个点是"向上"来描述相机的滚动。
希望有帮助。 :)
(根据评论编辑以更正摘要(
gluLookAt 的前两个参数是相机位置和相机目标。 只有这两个,相机并没有完全受到限制。 想象一下,站在某个地方拿着相机。 您可以水平握住相机拍摄横向照片,也可以垂直握住相机拍摄纵向照片。 在这两种情况下,相机的位置和图片主体的位置是相同的。 您可以将相机旋转到任何角度,这两个值不会改变。 第三个参数(向上矢量(用于选择相机的方向。
它的工作方式与它看起来的工作方式完全一样。
想象一下,你处于太空的某个点。他们想象你正在从你直接在 -Z 方向上看 2000 个单位的某个点。
具有这些特征的可能相机数量不胜数,但它们仅因具有不同的"向上"方向而有所不同。因此,不同的"向上"方向对应于围绕视图方向的不同方向。
向上矢量是与您希望相机具有的"向上"方向对齐的矢量方向。也就是说,如果要从相机点绘制向上矢量,您将看到一条指向上方的垂直直线。
现在,回头看看你想象的视图,看看那条垂直线。你能分辨出那条垂直线是朝你移动还是远离你吗?不;它只是一条垂直线。因此,向上向量是否部分指向视图方向并不重要。重要的是向上方向并不完全指向视图方向。
当您为向上方向提供非零 Z 坐标时,它现在部分指向视图方向(即:Z 轴(。这部分最终与你得到的向上方向无关,所以它被忽略了。当你给向上方向一个非零的X坐标时,它不在视图方向上,所以它很重要。
这样做的目的是,如果您更改视图视图或相机原点,则不必更改向上方向。只要你不直接沿着上轴看,你就没问题。