如何为Appel的隐藏线去除算法找到轮廓线


10

为了好玩,我尝试为DCPU-16制作线框查看器。我了解如何做所有事情,除了如何隐藏线框中隐藏的线。因此,这里所有的问题都假设您可以使用OpenGL,但是不幸的是,我无法使用DCPU-16之类的东西(或任何类型的硬件加速)。

我在Google图书上找到了关于Appel算法的相当不错的描述。但是,有一个问题我很难弄清楚。

Appel将轮廓线定义为由正面和背面多边形共享的边,或不是封闭多面体一部分的正面多边形的未共享边。由两个正面多边形共享的边不会改变可见性,因此不是轮廓线。在图8.4中,边缘AB,EF,PC,GK和CH是轮廓线,而边缘ED,DC和GI不是轮廓线。

图8.4

我了解算法的规则及其轮廓线后的工作方式,但是我不知道我该怎么做才能确定一条边是否被正面和背面多边形共享,或者从编码的角度来看,它不是封闭多面体的一部分的正面多边形的未共享边。我可以看一下形状,也可以知道脑海中的轮廓线是什么,但是我不知道如何将“理解”转换为编码算法。


更新资料

我在确定轮廓线方面取得了一些进展。我从布法罗大学计算机图形学课上找到了 两个讲义。

在此处输入图片说明

考虑边缘。这些分为三类。

  1. 连接两个不可见面的边本身就是不可见的。这将从列表中删除并忽略。
  2. 连接两个潜在可见面的边缘称为“材料边缘”,需要进一步处理。
  3. 连接潜在可见面和不可见面的边缘是“材料边缘”的特殊情况,也称为“轮廓边缘”。

使用以上两条信息,我可以更接近将其编写为代码,但是还有很长的路要走。



1
在计算三角形的法线时检查此答案。法线向量与视线向量的点积决定三角形是否朝前。

Answers:


3

为使“面向”规则成立,必须确保所有面向正确的方向。例如,使用右手规则,这意味着应该以一种方式对一个面的顶点进行编号,以使该面的平面中的正向旋转对应于多面体外部的法向指向。(明白吗?)或更简单地说,每张脸都必须带有其指向外部的法线。

悬挂的面(即不属于封闭的多面体)可以被视为具有不确定的方向。

现在,计算轮廓轮廓隐藏的边缘部分是主要过程。此问题非常类似于通过2D中的多边形窗口裁剪线段的问题。首先考虑线段的支撑线并找到与多边形的交点。通过使用奇偶校验规则,您可以轻松确定多边形内部和外部的部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.