相交边界时如何获得立方体的面?

时间:2019-02-02 17:01:27

标签: java libgdx

我有一个简化的多维数据集八叉树,其中树中的每个节点都有边界。现在,我要相交节点并找出面孔。我现在拥有的是树的递归下降,其中在每个级别上,节点从最近到最远排序。然后,像这样测试每个节点的交集:

Vector3 v = new Vector3();
if (Intersector.intersectRayBounds(ray, bounds, v)) {
    // found the intersecting cube
}

这可以正常工作,并且始终返回正确的节点,但是我如何找出相交的光线呢?这里,v包含交点,而我目前的解决方案依赖于此:

// level is the size of the cube
// x, y and z are the min-coordinates of the node
float halfSize = level / 2f;
v = v.sub(x + halfSize, y + halfSize, z + halfSize).nor();

// Now, v should be a directional vector from the
// center of the node to the intersection point

Face face = Face.FRONT;
float absX = Math.abs(v.x);
float absY = Math.abs(v.y);
float absZ = Math.abs(v.z);

if (absX > absY && absX > absZ) {
    face = v.x < 0f ? Face.LEFT : Face.RIGHT;
} else if (absY > absX && absY > absZ) {
    face = v.y < 0f ? Face.BOTTOM : Face.TOP;
} else if (absZ > absX && absZ > absY) {
    face = v.z < 0f ? Face.BACK : Face.FRONT;
}

这在90%的时间内有效,但是有时,当多维数据集彼此相邻并且鼠标光标靠近(但不完全是)多维数据集连接点的中间时,所报告的面是内部面之一

Wrong face selected

从图像中可以看出,面对另一个立方体的面不应该被选择,而是选择。我将如何避免这种情况并使它每次都能正常工作?

0 个答案:

没有答案