从脸部的4个顶点获得z深度

时间:2009-09-21 11:29:01

标签: flash math 3d actionscript-2 trigonometry

如何使用每个面的4个顶点对3d对象的面进行z排序?我尝试使用z-buffer,我存储每个面的平均z值;这在大多数时候都很有效,但是当一个物体有大面积和小面孔时会失败。

我正在flash中构建一个小型3D引擎,只是为了学习的乐趣,所以我唯一拥有的数据就是那4个顶点和脸部法线。

谢谢!

3 个答案:

答案 0 :(得分:1)

你正在对抗Visibility Problem,并没有简单的答案。 This page更详细地描述了这个问题,可能会给你一些想法。 “真正的”3D引擎解决这个问题的方式是,它们逐个像素地绘制场景,并且它们保持到目前为止绘制到任何给定像素的最顶层对象的Z坐标的轨迹。我们在Flash中无法使用此方法,因此我们通常可以做的最好的是近似或概括。

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

答案 1 :(得分:0)

当所有面部大小大致相同时,Z缓冲效果最佳。如果你有任何比其他更大的东西,那么他们将“覆盖”那些给你文物的小的。

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

答案 2 :(得分:0)

另一种非常简单的方法是BSP trees。它的一个问题是在3D中它具有一些非常糟糕的最坏情况性能特征。你通常只会遇到一些非常奇怪的情况,所以可能值得尝试并看看它在你的情况下是如何工作的。

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