【问题标题】:how to "sort" polygons 3d?如何“排序”多边形 3d?
【发布时间】:2011-06-11 04:07:54
【问题描述】:

我仍在研究我的“javascript 3d 引擎”(link inside stackoverflow)。 起初,我所有的多边形都是立方体的面,所以按平均 Z 对它们进行排序工作正常。 但现在我已经“进化”了,我想绘制我的多边形(可能包含超过 4 个顶点) 以正确的顺序,即那些靠近相机的将被最后绘制。

基本上, 我知道如何旋转它们并将它们“透视”化为 2D, 但不知道如何按正确的顺序绘制它们。

只是为了澄清:

//my 3d shape = array of polygons
//polygon = array of vertices
//vertex = point with x,y,z
//rotation is around (0,0,0) and my view point is (0,0,something) I guess.

谁能帮忙?

ps:我想出了一些“流行语”,正在寻找解决方案:z 缓冲、射线投射(?!)、平面方程、视图矢量等等——我想我需要一个简单易懂的答案,所以这就是我问这个的原因。谢谢。

p.s2:我不太介意重叠或相交多边形......所以也许画家的算法确实可能很好。但是:到底是什么?如何确定多边形的距离?一个多边形有很多点。

【问题讨论】:

  • 有趣的是,如果所有多边形都是不透明的,我认为首先绘制最靠近屏幕的多边形会获得更好的性能。这是由于剩余的(隐藏的)多边形未能通过深度测试并且没有被渲染。如果它们是透明的,则需要您建议的顺序。

标签: javascript 3d polygons


【解决方案1】:

排序多边形然后从下到上绘制它们的方法称为“画家算法”。不幸的是,排序步骤通常是一个无法解决的问题,因为 3 个多边形可能相互重叠:

因此,不一定有任何“在顶部”的多边形。使用 Z 缓冲区或 BSP 树(涉及分割多边形)等替代方法不会遇到此问题。

【讨论】:

    【解决方案2】:

    我认为通过研究 BSP 树(二进制空间分区树)你会有一些想法,即使算法需要将你的一些多边形一分为二。 一些示例可以在这里找到http://www.devmaster.net/articles/bsp-trees/ 或通过谷歌找到 BSP 树。在我看来,发布一些代码作为回复并不严重,因为这是一个复杂的话题。

    【讨论】:

    • 我说的是大约 6-20 个多边形的形状,我认为画家的算法可能已经足够好了。我只需要知道由谁来做。
    • 复杂性会随着时间的推移而增加,如果你有一些经过全面测试的几何原语,BSP 并不是那么可怕。
    • 对不起,但我不知道 BSP 树是什么以及我是否应该根据您的建议对其进行真正的调查,-我真正需要的是一个示例,是的-甚至一些行的代码会很棒。
    • @alfred 我确实改进了答案。贴代码不是那么容易,但是我找到的第一篇文章有​​一些伪代码。一旦有了场景的 BSP 树,就可以遍历它并实现空间“排序”
    • 谢谢。但我希望利用别人的工作而不是重新发明轮子。不过,这似乎是一个更友好的教程 - 我担心我必须阅读它:-( maven.smith.edu/~mcharley/bsp/createbsptree.html
    【解决方案3】:

    如何确定多边形的距离?一个多边形有很多点。

    Painter 的算法实现起来最简单,但它只适用于非常简单的情况,因为它假设每个多边形只有一个“距离”或 z 值(您可以近似为 z 的平均值)多边形中所有点的值)。当然,如果两个多边形相交会产生错误的结果。

    实际上,多边形没有单一的距离值 - 多边形表面上的每个点与观察者的距离可能不同,因此每个点都有自己的“距离”或深度。

    您已经提到了Z-buffering,这是这样做的一种方式。我认为您不能在 HTML 画布上有效地实现这一点,但总体思路如下:

    1. 您需要维护一个额外的画布,即“z 缓冲区”,其中每个像素的颜色代表主画布上相应像素的 z 深度。

    2. 要绘制多边形,您需要遍历其表面上的每个点,并仅绘制比任何先前对象更靠近观察者的点,如 z 缓冲区所示。

    【讨论】:

    • 这一切都很好,但什么是 z 深度?如果我知道 z 深度,我早就用它排序了。
    • @alfred:你说你已经“透视”了你的观点; z 深度只是一个点到观察平面的距离。如果您的观察平面位于 z = 0,则 z 深度与点的 z 坐标相同(经过其他变换)。正如我所提到的,对于画家算法,您可以平均 z 值以获得多边形的单个深度。
    猜你喜欢
    • 2015-01-09
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2010-09-30
    • 2012-12-15
    相关资源
    最近更新 更多