gluLookAt eyeZ无法按预期工作

时间:2012-04-23 14:20:08

标签: opengl glu

我在使用gluLookAt的eyeZ值时遇到了一些麻烦。

我想象它的工作方式就像将摄像机移开一边,从而缩小视野中的物体。

我有一个简单的设置,在3d空间绘制中通过glDrawElements绘制一个简单的形状,其中100x100x100正交,其中0,0,0是宇宙的中心。该对象为0,0,0。

我正在尝试这样做,当你滚动鼠标滚轮时,你会越来越远离物体。这就是glulookat的召唤方式。

float eyeX = 0;
float eyeY = 0;
float eyeZ = differenceInMouseWheel();

float centerX = 0;
float centerY = 0;
float centerZ = 0;

float upX = 0;
float upY = 1;
float upZ = 0;

gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);

这里唯一改变的是eyeZ。

效果很奇怪,我滚动了大约10秒钟然后突然有一半的物体消失了。从那里越来越多的消失了。这可能是因为相机正在走出50 z距离限制,但我无法理解为什么物体不像3D空间那样缩放。

也许我误解了中心价值观是如何运作的?

我也尝试将differenceInMouseWheel()应用于centerZ,但这没有任何改变,我将假设中心值只是因此,glu可以获得方向而已。

也许up向量应该改变?我现在还不知道。

2 个答案:

答案 0 :(得分:0)

您使用的是透视投影矩阵还是正交投影矩阵?如果你不使用透视矩阵,当你移动相机时,对象的大小似乎不会改变。

答案 1 :(得分:0)

您正在使用orthographic projection。这意味着无论距离有多远,您的对象总是看起来具有相同的大小。一旦它到达远剪裁平面,你的物体就会消失,这就是你滚动很长时间时所看到的。

您有两种选择:使用perspective projection或通过修改拼写投影矩阵来实现缩放,如下所示:

让缩放在(0,1)中,让视口成为设置为当前视口的矩形。让你的近剪裁平面距离近,远远超过你的剪裁平面距离。

glOrtho(zoom * viewport.width / 2, zoom * viewport.width / 2, zoom * viewport.height / 2, zoom * viewport.height / 2, near, far);