【问题标题】:View frustum culling a box in Java在 Java 中查看截锥体剔除框
【发布时间】:2011-06-16 00:59:35
【问题描述】:

给定视锥体(由 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
    //...
}

C++ 实现可以在http://www.lighthouse3d.com/tutorials/view-frustum-culling/找到

编辑:这是 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);
}

【问题讨论】:

    标签: java math


    【解决方案1】:

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

    int FrustumR.pointInFrustum(Vec3 p)
    

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

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

    【讨论】:

    • 注意:我指的是this page上的代码,我假设你也是。
    • 另外:阅读灯塔代码,看起来 Vec3 类使用了运算符重载,这在 Java 中是不可用的。您将需要为此编写一些方法。例如,您需要写 Vec3 v = p.minus(camPos),而不是 Vec3 v = p-camPos
    • 网站上的代码使用了相机参考,以及近处和远处的剪裁平面。有关我可用的内容,请参见上文。如果您很清楚如何生成相机参考,或者如何重写代码以使用旋转和俯仰,请解释一下,因为无论出于何种原因,我链接的教程让我一无所知。 (评论/问题应使用“添加评论”发布。)
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多