我正在创建一个简单的小软件3D引擎。现在,如果所有顶点都在平截头体之外,则多边形不会渲染,这一切都很好,直到你接近多边形并且所有顶点都在屏幕外但中间仍然是在视锥体内,但它无论如何都省略了它。我会尝试渲染它,但我需要做一些优化,所以这是我想到的第一个。
这是一个gif&如果你不理解我想要解决的问题,可以使用一些问题代码。
boolean v1Inside = v1.isInsideViewFrustum();
boolean v2Inside = v2.isInsideViewFrustum();
boolean v3Inside = v3.isInsideViewFrustum();
if (v1Inside && v2Inside && v3Inside) {
rasterizeTriangle(v1, v2, v3);
return;
}
if (!(v1Inside || v2Inside || v3Inside)) {
return;
}
答案 0 :(得分:1)
您可以实施保守方法来进行视锥体剔除,偶尔会出现误报(而不是假阴性)。如果所有顶点都落在某个平截头体平面的错误一侧,最典型的方法是拒绝三角形。
a b
A | B | C
--+-------+------- c
D | | E
| |
---+-------+------- d
F | G | H
这里在2D情况下,有四个剪裁平面:a,b,c,d。 这种方法拒绝了一个完全在线/平面以上的三角形,在线' d'线的左下方' a'或者权利' b'而不是拒绝,例如您在B,G和H段中的顶点情况。
这种剔除在透视投影后很容易实现,给出了简单的方程式: x0,x1,x2< -1,或使用平截头体的平面方程:
dot_product(vertex, plane) < constant_i.
答案 1 :(得分:0)
此问题的事实上的标准算法是Cohen-Sutherland Line Clipping algorithm。它很容易扩展到凸多边形,因为如果它的任何边都可见,它们都是可见的。
编辑:当谈到多边形时,你必须测试围绕或涉及中心的循环。你可以使用XOR和辅助位掩码来做到这一点。一旦我找到了一个很好的参考资料,我会在这里添加。