关于将3D对象映射到2D显示器的简要讨论






4.93/5 (11投票s)
2002年4月21日
4分钟阅读

151944

4865
本文用简单的术语描述了如何将三维坐标转换为显示在屏幕上的二维坐标。
简要讨论了将 3D 对象映射到 2D 显示器。
本文用简单的术语描述了如何将三维坐标转换为显示在屏幕上的二维坐标。
本文旨在介绍 3D 图像渲染的基础知识,不包括旋转或移动等主题。
一些基本定义和假设
我们将使用的坐标系是标准笛卡尔坐标系,如图 1 所示。
其中: o
是原点
+x
向右(-x
向左)
+y
向上(-y
向下)
+z
向前(-z
是反方向)
此 3D 空间中的一个点可以将其位置表示为 P(x, y, z)
,表示其相对于上面定义的原点的位置。 多边形将仅仅是连接起来的点集。
(0, 0, 0)
。 在本文后面,我们将摄像机移离原点。 另一个简化是假设摄像机始终沿着 Z 轴朝向 +Z 方向观察。 如果不是这样,数学会更复杂,我这里就不讨论了。最后,我们需要一个投影图像的地方,屏幕 S。 这将始终位于一个与观察方向成直角的平面上,并且距离原点为 Sz
。 可以假设屏幕的范围足以容纳所需内容。 图 2 显示了当前场景。
看到点
如果我们沿着 X 轴观察场景,我们将得到 YZ 平面的 2D 横截面(从正侧朝向原点观察)。 现在,我们在摄像机和要在屏幕上显示的点之间画一条假想线,我们可以看到这条线将与屏幕上的点 S
相交。 图 3 说明了这一点。
我们已经知道屏幕点的 z 坐标(Sz
,与屏幕相同),我们需要计算其 y 值。
基本三角学可以给出答案。 根据相似三角形的规则,我们可以看到 Sz
与 Pz
的比率与 Sy
与 Py
的比率相同; 写成方程,我们有:-
Sz = Sy
Pz Py
重新排列公式可得到 Sy
的以下方程;
Sy = Py Sz
Pz
类似的处置也将得到 X 坐标的类似方程。
Sx = Px Sz
Pz
可以看到,如果我们有另一个点 P2,如图 4 所示,它具有相同的 X 和 Y 值但 Z 值不同,可以看到它在屏幕上与不同的点相交。 这模仿了我们在现实生活中注意到的透视效果。 远处的物体看起来比近处的物体小。
将摄像机移离原点?
上述公式仅在坐标相对于原点(即 (0, 0, 0)
)时有效。 如果摄像机不在原点,我们需要调整公式来考虑这一点。 图 5 显示摄像机沿 Y 轴和 Z 轴移动。
如果我们回到第一个方程并为偏移量调整它们,我们得到
(Sz-Ez) = (Sy-Ey)
(Pz-Ez) (Py-Ey)
重新排列公式得到
(Sy-Ey) = (Py-Ey)*(Sz-Ez)
(Pz-Ez)
所以,我们得到
Sy = (Py-Ey)*( Sz-Ez) + Ey
( Pz-Ez)
类似地,对 Sx 进行类似的变换,
Sx = (Px-Ex)*( Sz-Ez) + Ex
( Pz-Ez)
关于程序
鉴于这是 Code Project,我想提供一些代码是有益的。 我编写的 演示 程序用于显示更改影响图像渲染的某些参数的效果。 我使用了 Chris Maunder 的 3D 类,但这些类中的大部分功能都没有被使用。
使用程序
运行程序时,您会看到三个“线框”房屋,它们实际上大小相同,但位于不同的 Z 坐标。 您可以使用工具栏按钮或键盘来移动摄像机。
以下按键在程序中执行相应操作:
K/L
:沿“Z”轴移动屏幕位置
A/D
:沿“X”轴移动摄像机位置
W/X
:沿“Y”轴移动摄像机位置
R/T
:沿“Z”轴移动摄像机位置
按下工具栏按钮将沿着按钮图标所示方向移动摄像机(如果您能解读我的艺术创作)。