查看在Java中剔除一个盒子的视锥体

时间:2011-06-15 06:36:23

标签: java math

给定视锥体(由x,y,z摄像机位置,旋转[0-360]和俯仰[0-180]定义,以及视角(例如45))什么是(最好是最快)用于确定框(由两个相对的角点定义)是否部分或完全在该平截头体内的Java代码?

更确切地说,我如何完成以下操作?

static boolean isBoxInFrustum(float cx, float cy, float cz, // Vector camera,
        float rotation, float pitch, float angle, 
        float p1x, float p1y, float p1z,    // Vector point1,
        float p2x, float p2y, float p2z) {  // Vector point2
    //...
}

可以在http://www.lighthouse3d.com/tutorials/view-frustum-culling/

找到C ++实现

编辑:这是2d版本,只有4行,在我看来很容易理解 - 如何将其修改成3D检查?

static boolean isPointInFrustum(
        Vector cam, float rot, float pitch, float ang, Vector point) {
    Vector diff = cam.minus(point);
    float deg = Maths.arctan(diff.y, diff.x) + rot + 360;
    deg %= 360;
    return (deg > 180-ang && deg < 180+ang);
}

1 个答案:

答案 0 :(得分:-1)

除了基本语法之外,Java代码与C ++代码有何不同?我注意到该站点上的C ++代码比上面的接口更加面向对象。你不能在Lighthouse代码和FrustumR类中构建一个Vec3类,然后添加一个方法:

int FrustumR.pointInFrustum(Vec3 p)

由于该方法的主体不处理指针(仅算术),因此您应该能够基本粘贴它,它将在Java中工作。

如果由于某种原因无法实现这些类,则应该能够通过将对这些类的成员的引用更改为对参数的引用来翻译C ++代码。