在不使用类似 OpenGL 的库的情况下,我可以使用什么公式或算法来绘制 3D 球体?

What formula or algorithm can I use to draw a 3D Sphere without using OpenGL-like libs?

我知道有 4 种绘制 3D 对象的技巧:

(1) 线框建模和渲染,(2) 加法建模,(3) 减法建模,(4) 样条曲线和曲线。

然后,这些模型通过隐藏面去除算法。

我说得对吗?

那么,我可以使用什么公式或算法来绘制 3D 球体?

我正在使用名为 WinBGIm from colorado university 的低级库。

如果您正在寻找隐藏线移除(绘制边缘而不是面部内部),解决方案很简单:"back face culling"。

模型的每条边都属于两个面。对于每个面,您都可以计算法向量并检查它是否面向观察者(通过法线点积和投影线方向的符号);换句话说,如果观察者位于面部平面定义的外半部-space。那么一条边是完全可见的当且仅当它属于至少一个正面。


球体的通常离散化是通过绘制等距的纬线和子午线来实现的。调整平行线的间距可能是有利的,这样所有瓷砖的面积都差不多。

there are 4 techniques to draw 3D objects:

(1) Wireframe Modeling and rendering, (2) Additive Modeling, (3) Subtractive Modeling, (4) Splines and curves.

这些是建模技术而不是渲染技术。它们允许您以数学方式定义网格的几何形状。如何将此数据渲染到 2D canvas 是另一回事。

在 2D 上渲染 3D 模型有两种基本方法 canvas。

光线追踪

光线追踪的基本思想是从相机的原点发出光线,通过 canvas 上需要确定颜色的点。确定哪些模型被它击中并选择最接近的模型,确定它如何点亮以计算那里的颜色。这是通过进一步追踪从命中点到场景中所有光源的光线来完成的。如果您注意到,这种方法无需使用背面剔除、z 缓冲区等隐藏表面确定算法,因为基本思想植根于隐藏表面算法(光线追踪)。

有包、库等可以帮助您做到这一点。但是,通常将光线追踪器作为大学级别的项目从头开始编写。然而,这种方法需要更多时间来渲染(而不是编码),但结果通常比下面的方法更令人满意。当您想要渲染电影等非交互式视觉效果时,这种方法更受欢迎。

栅格化

这种方法采用定义场景中模型的基元(三角形和四边形)并定期对其进行采样(它们覆盖的屏幕像素)并将其写入颜色缓冲区。这里隐藏的表面通常使用 Z 缓冲区消除;存储片段的 z 顺序的缓冲区,在写入颜色缓冲区时,越接近的缓冲区越好。

光栅化是一种更流行的方法,由于多年的研究和投入的资金,大多数现代计算机都可以使用廉价的硬件支持它。 OpenGL 和 Direct3D 等库可随时用于促进开发。虽然结果不如光线追踪那么令人满意,但渲染速度更快,因此被广泛用于游戏等交互式实时渲染。

如果你不想使用这些库,那么你必须做通常称为软件渲染的事情,即你最终会做这些库做的事情。

What formula or algorithm can I use to draw a 3D Sphere?

取决于您选择以上哪一项。如果您简单地使用正交投影将 3D 球体栅格化为 2D,您所要做的就是在 canvas.

上绘制一个圆圈