我在使用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向量应该改变?我现在还不知道。
答案 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);