1

我在使用 gluLookAt 的 eyeZ 值时遇到了一些问题。

我想象它的工作方式就像将相机移得更远,从而缩小视野中的物体。

我有一个简单的设置,在 3d 空间中绘制一个简单的形状,通过glDrawElements100x100x100 正交,其中 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 可以得到一个方向,仅此而已。

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

4

2 回答 2

0

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

于 2012-04-23T15:59:45.873 回答
0

您正在使用正交投影。这意味着无论距离有多远,您的对象总是看起来具有相同的大小。但是,一旦您的对象到达远剪切平面,您的对象就会消失,这是您长时间滚动时所看到的。

您有两个选择:要么使用透视投影,要么通过修改正交投影矩阵来实现缩放,如下所示:

让放大为 (0, 1],并让视口为设置为当前视口的矩形。让 near 为您的近剪裁平面距离,far 为您的远剪裁平面距离。

glOrtho(zoom * viewport.width / 2, zoom * viewport.width / 2, zoom * viewport.height / 2, zoom * viewport.height / 2, near, far);
于 2012-04-24T08:20:19.347 回答