3D图像如何绘制?

当计算机绘制一个三维模型时,它是否使用类似于vector投影的math? 就像当一个3d模型被绘制和旋转一样时,它是使用向量/还是其他一些math知道在哪里绘制每条边?

如果是这样,每次刷新屏幕都会进行这个计算吗?

只是想看看我能否创建一个看起来像在3D空间中旋转的基本方形。 只是为了挑战,没有任何实际的。

对不起,如果我不清楚,这是难以解释的问题之一。

是的,计算机需要做大量的计算才能将3D场景渲染成自然的2D屏幕。

这可以在CPU上完成,但现在几乎总是在GPU上完成。 这整个过程通常被称为我以前写过的graphics管道 。 阅读这篇文章,因为我相信它总结了大部分的过程。

回答你的具体问题:

它使用类似于vector投影的math吗?

它使用了很多不同的“mathtypes”。 它使用了很多涉及向量和matrix的线性代数。 它处理诸如在不同空间之间转换坐标的转换。 它使用照明模型计算来确定场景的阴影。 而且它也使用了很多其他的algorithm。

如果是这样,每次刷新屏幕都会进行这个计算吗?

通常,是的。 大多数游戏运行在游戏循环之上,所以整个stream水线每帧处理一次。 但在其他一些环境下,只要场景发生变化,您也可以根据需要更新它(例如通过调用Invalidate()来强制重绘控件)。

只是想看看我能否创建一个看起来像在3D空间中旋转的基本方形。 只是为了挑战,没有任何实际的。

您可以通过简单地“旋转”正方形,使其旋转,给人一种印象,那就是3D。 但是如果您想要更接近于3Dgraphics管道的工作原理,那么最低限度需要的是:

  • 3D空间中的顶点结构
  • 在模型空间中定义您的方形的顶点列表
  • 世界matrix旋转你的广场
  • 透视投影matrix将其转换为2D(剪辑空间)
  • 一个视口转换,以适应剪辑空间到您的窗口/视口
  • 光栅化器“绘制”旋转的正方形

根据您决定实施的平台,您可以使用许多或所有这些步骤。

PS:顺便说一句,从教育的角度来看,你认为这是一个非常好的主意,你正试图实现这样的事情。 我经历了很长一段时间,才明白所有这些3D工作是如何工作的,而当我最终坐下来实现我自己的graphics管道时,所有这一切真的被点击了。 一年后,我用光线追踪做了同样的事情,也许这些日子里我也会尝试一下光能。 或者向后退一步,创造出一些仅仅为了娱乐而使用的Wolfenstein 3D-ish光线投射场景。

大卫给出了一个很好的答案,但对于初学者来说,我认为这让3D渲染听起来太难了。 尽管3D引擎通常都具有这些function,但列表并不是最基本的。 在过去,做实时三维graphics没有任何matrix或思考不同空间的情况并不罕见。

matrix是表示旋转的好方法,但也有其他的方法。 例如,如果你有xy坐标,并且你想围绕y轴旋转,你可以使用三角函数,如:

rotatedX = cos(angle) * x; rotatedY = y; rotatedZ = sin(angle) * x; 

投影matrix对于表示不同types的投影是有用的,但通过z的简单分割往往足以进行透视投影:

 // CONSTANT depends on the field of view and screen size. // zOffset can be used to move the objects away from the screen. screenX = screenWidth / 2 + CONSTANT * rotatedX / (rotatedZ + zOffset); screenY = screenHeight / 2 + CONSTANT * rotatedY / (rotatedZ + zOffset); 

如果您不想使用3D硬件,并且不熟悉光栅化声音,则可以先将该对象渲染为线框。 只需画线连接不同的投影点。

这应该足以让3D空间中的方形旋转到屏幕上。