如何绘制3D表面并隐藏不可见的线条?

时间:2009-05-29 03:40:57

标签: 3d

有人知道如何绘制3D曲面并隐藏不可见的线条吗?

我记得从Apple II书中读过一些代码,它在BASIC中只有大约25行,它可以绘制一些3D表面,例如山峰或看起来像水波纹的形状。首先显示了不可见的线条,但在添加几行代码后,隐形线也消失了。

有人知道如何做到这一点或知道网上的资源吗?

3 个答案:

答案 0 :(得分:5)

这取决于您如何绘制多边形。我建议您阅读一些关于OpenGL或DirectX的内容,因为它们旨在为您解决许多这些问题。如果您不想直接使用它们,那么已经在这些API之上构建了许多优秀的引擎。

假设您正在绘制填充多边形(纹理,实体等),可以使用以下几种常用算法:

  • 按照距离相机的距离对多边形进行排序,然后首先绘制最远的多边形,也称为Painters Algorithm。许多旧3D游戏都使用此方法,例如经典的Doom,它也使用BSP Tree进行有效排序。

  • 将距离相机最近的距离存储在屏幕上的每个pizel上,不要画得更远,也称为Z-Buffering。现代3D视频卡,OpenGL和DirectX都很好地支持这种方法。

  • 使用自然隐藏表面移除的ray tracing算法。

答案 1 :(得分:4)

我记得那本书。如果我没记错的话,这些是表面图,使用的技巧是从前到后绘制线条,跟踪每个x的最小和最大y。可能是线条抽屉是Bresenham,修改为跳过绘制的点,除非它们大于最大值或小于最小值。

算法有什么好处,你也可以做曲线。不只是细分市场。波纹图可能是某种三角函数与x和y作为参数的组合。

我仍然可以在脑海中看到那些情节。很想知道来自哪本书。

答案 2 :(得分:2)

如果绘制三角形网格,则应对每个三角形进行背面剔除,不要绘制具有背面法线的三角形边缘。您可以将法线计算为三角形中两个连续边的叉积。

如果只想绘制轮廓,则只绘制在具有正面法线的三角形和具有背面法线的三角形之间的边缘。

或者您使用OpenGL,打开深度缓冲区,忘记所有基础数​​学: - )