Opengl 视图截锥体剔除角案例

Opengl 视图截锥体剔除角案例,opengl,graphics,3d,Opengl,Graphics,3d,我正在为一个新的OpenGL项目检查我的视图截锥剔除代码,并注意到有太多的具有大边界体积(例如球体)和较小截锥的角点情况。边界体积与截锥体体积不相交的角点情况将被视为可见。我使用的方法(几何平截头体平面方法而非雷达)用于提取平面并根据边界体积进行测试 下面是一个示例(所有平截头体平面法线都向内(蓝线)) 上图是自上而下的,但顶部或底部平截头体平面也不拒绝球体 此相交方法族依赖于至少有一个平截头体平面将体积拒绝为外部。但在某些情况下,体积不相交,但没有一个平截头体平面拒绝体积,例如在我发布的图像

我正在为一个新的OpenGL项目检查我的视图截锥剔除代码,并注意到有太多的具有大边界体积(例如球体)和较小截锥的角点情况。边界体积与截锥体体积不相交的角点情况将被视为可见。我使用的方法(几何平截头体平面方法而非雷达)用于提取平面并根据边界体积进行测试

下面是一个示例(所有平截头体平面法线都向内(蓝线))

上图是自上而下的,但顶部或底部平截头体平面也不拒绝球体

此相交方法族依赖于至少有一个平截头体平面将体积拒绝为外部。但在某些情况下,体积不相交,但没有一个平截头体平面拒绝体积,例如在我发布的图像中


处理通常如何处理此类情况(如果可能,仍使用世界空间平截头体平面剔除技术)?

由于两者都是凸面形状,因此可以使用分离轴定理(SAT)()测试交点,以执行更正确的测试。 对于长方体,这通常意味着反转测试:根据立方体的各个面平面测试平截头体(尽管原始测试希望使用更有效的P/N测试)。对于球体,可以通过将球体的中心连接到离球体最近的平截头体角(这将是平面的法线)来构造测试平面,然后将其放置以使其擦伤球体。如果该角位于平面的负侧,则该角相交。我编辑了你的照片来说明这一点

[为澄清而编辑]

这可以归结为一个简单的“距离(角、中心)>半径”测试,但在更一般的情况下,从SAT的角度考虑它会有所帮助

要查找最近的角点,可以简单地测试所有角点,也可以使用以前的平面测试结果将角点限制为与球体相交的平截头体平面所包含的角点

[/编辑]


总而言之,您需要确定额外的剔除成本是否真的值得。tho。

冒犯角是指离球体中心最近的角吗?用这个来测试平截头体,你是说所有平截头体的角都对着这个新平面吗?我还需要对大型AABB进行测试,但我想我知道你所说的反向测试是什么意思,但是你如何对一个平截头体进行类似pn顶点的测试(如何找到平截头体的p和n)?是的,离中心最近的点。我会用一些更合理的信息更新原始帖子。我在解释AABB反转时有点粗心(P/N是未反转的情况,但你应该能够很容易地研究一般多面体上的分离轴定理,就像这样)。