1

如何仅使用每个面的 4 个顶点对 3d 对象的面进行 z 排序?我尝试使用 z 缓冲区来存储每个面的平均 z 值;这在大多数情况下都很好用,但是当对象有大面和小面时会失败。

我在 Flash 中构建了一个小型 3d 引擎,只是为了学习的乐趣,所以我拥有的唯一数据是这 4 个顶点和面部的法线。

谢谢!

4

3 回答 3

1

您遇到了Visibility Problem,没有简单的答案。这个页面更详细地描述了这个问题,并且可能会给你一些想法。“真正的”3D 引擎解决这个问题的方法是,它们逐个像素地绘制场景,并且它们一直在跟踪绘制到任何给定像素的最顶部对象的 Z 坐标。这种方法在 Flash 中对我们不可用,所以我们通常能做的最好的就是近似或概括。

一种常见的方法(在前面的链接中描述)是将面分组为凸多边形,因为它很容易对凸多边形的面进行深度排序,并且相对容易对多边形本身进行深度排序。如果这是可行的,这就是我要走的路。

于 2009-09-21T19:05:15.717 回答
0

当所有面的大小大致相同时,Z 缓冲效果最好。如果你有任何比其他的要大得多,那么他们将“覆盖”较小的那些给你人工制品。

唯一的解决方案是将较大的面分解成更接近平均尺寸的较小的面。

于 2009-09-21T11:34:21.567 回答
0

另一种实现起来非常简单的方法是BSP 树。它的一个问题是在 3D 中它具有一些非常糟糕的最坏情况性能特征。你通常只会用一些非常奇怪的球箱来解决这个问题,所以可能值得尝试一下,看看它在你的情况下是如何工作的。

基本思想是构建一棵二叉树,其中每个内部节点都有一个平面方程,每个叶子都有一个多边形。在每个内部节点处,左子节点中的所有多边形都位于平面的一侧,而右子节点中的所有多边形都位于另一侧。您必须拆分任何穿过平面的多边形。这就是不好的情况出现的地方。如果您的多边形被排列成每个多边形的平面分割所有其他多边形,那么它会变得丑陋。

于 2009-12-05T04:02:30.790 回答