3D透视:最简单易懂的成像原理及实现教程
写在前面
这篇文章已经构思很久了,一直不知道该如何下笔,就寻思着写了再说。由于本人英语不怎么好,有些变量命名会比较随意。如果这篇博客有什么错误,请指正,感谢。
原理介绍
3D透视图说到底是模拟人眼成像。将人眼作为视点O,以视点为三维坐标系的原点,过原点做一条射线,这条射线称为视线,过视线做一个垂直视线的平面,称为视平面P,P与视线的交点称为C,且OC长度已知,称为视距。从O做射线过P的四个顶点在空间中形成一个四棱锥,P以下的部分形成一个棱台,位于这个棱台内的点与O连线,这条线段与P的交点M即使人眼中点A所成的像。如下图所示。
一般模型
三维坐标系中一条过原点的射线可以通过它与平面ZOY、平面ZOX的成角来确定,与平面ZOY的成角我称为ha,与平面ZOX的成角我称为va。
一般模型的特殊情况是视线的va、ha均为0时候。
计算一般模型时直线OA在P上的点坐标
- 做A(ax, ay, az)在Z轴上的垂线与Z轴交于点N,计算这条垂线的长度:AN = sqr(ax ^ 2 + ay ^ 2)
- 计算ON的长度:因为N在Z轴上所以ON = abs(az)
- 做M垂直于Z轴于V,求MV的长度:因为三角形ONA于三角形OVM相似,所以VM与AN成比例,既:MV = AN / ON * OC
- 求mx:mx = ax / AN* MV
- 求my:my = ay / AN* MV
- 求mz:在一般模型中mz并不是那么重要——毕竟P上的点的z坐标都等于OC
- 将点绘制在屏幕上,这不难理解。P是和XOY平面平行的,所以可以直接用点M的坐标来绘制。