【发布时间】:2014-12-02 00:16:00
【问题描述】:
我有一些树,它们在游戏中大大滞后,所以我想检查一下这些树是否在镜头前。
我得到了Mathematics forum 的一些帮助,还查看了This link 以帮助我将俯仰/偏航转换为所需的方向矢量。
但是由于某种原因,每当我将相机向左移动时,树木就会变得可见,而每当我将相机向右移动时,它们就会变得不可见(因此,如果相机指向 Z 轴上的 +1,似乎渲染树木,但在 Z 轴上为 -1,它似乎没有渲染它们)。 (请参阅http://i.gyazo.com/cdd05dc3f5dbdc07577c6e41fab3a549 以获得较少跳跃的 .mp4)
我正在使用下面的代码来检查一个物体是否在相机前面:
Ship you = shipsID.get(UID);
int dis = 300;
Vector3f X = new Vector3f(camera.x(), camera.y(), camera.z());
float x = (float) (Math.cos(Math.toRadians(camera.yaw()))*Math.cos(Math.toRadians(camera.pitch())));
float y = (float) (Math.sin(Math.toRadians(camera.yaw()))*Math.cos(Math.toRadians(camera.pitch())));
float z = (float) Math.sin(Math.toRadians(camera.pitch()));
Vector3f V = new Vector3f(x, y, z);
for (Tree tree : trees){
Vector3f Y = new Vector3f(tree.location.x, tree.location.y, tree.location.z);
Vector3f YMinusX = Y.negate(X);//new Vector3f(Y.x - X.x, Y.y - X.y, Y.z - X.z);
float dot = Vector3f.dot(YMinusX, V);
if (dot > 0){
tree.render();
}
}
有人能告诉我我在这里做错了什么吗?我不知道是数学..还是代码..还是什么?
相机翻译代码:
public void applyTranslations() {
glPushAttrib(GL_TRANSFORM_BIT);
glMatrixMode(GL_MODELVIEW);
glRotatef(pitch, 1, 0, 0);
glRotatef(yaw, 0, 1, 0);
lastYaw = yaw;
glRotatef(roll, 0, 0, 1);
glTranslatef(-x, -y, -z);
glPopAttrib();
}
更新:
它似乎是相机正在寻找的地方。例如,如果我查看 -Z,什么都不会发生,但如果我查看 +Z,它们都会呈现。
if (dot > 0) code 似乎是 +Z 而不是 +TheCameraRotation。
【问题讨论】:
-
Frustum Culling 是一种更适合移除隐藏几何体的方法。 Check this tutorial.
-
你能把
this checks the distance to the ship*/ if (you.location.x - tree.location.x < dis && you.location.x - tree.location.x > -dis && you.location.z - tree.location.z < dis && you.location.z - tree.location.z > -dis)这行放到可见屏幕上吗? -
@Coffee 我想我做了你想要的。如果不是,那你能澄清一下吗?
-
您有两个标准来拒绝树:距离测试和点积测试。您可以通过禁用其中之一轻松找出导致树木消失的原因之一。这将缩小问题的范围。
-
最可能的问题是你这里计算的相机方向和你渲染时应用的相机变换不一致。在此处未显示的代码中的某处,您必须根据相机参数计算相机(视图)转换。我怀疑它应用相机参数的方式与它们在发布的代码中的使用方式不同。