- UID
- 1
- 精华
- 积分
- 76363
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
大家可能认为学会3D编程必须要学会DirectX、OpenGL、SDL等图形库。其实这些图形库只是帮你渲染图形、设置显卡加速而已。
想要学会3D编程,必须弄懂3D编程的原理。
我这里大致讲讲最基础的原理:
1、任何“物体”都是由三角形面片、线段、点组成的。
2、模型是如何渲染到屏幕上的?模型其实是一个“顶点数据”的数组,每个顶点先通过乘矩阵来变换坐标位置,然后将其变换到摄像头的面前,接着取其Z值作为“距离”,取其X、Y作为其在屏幕中的位置。
3、遮挡关系是怎么解决的?有个“深度缓冲区”,专门用来储存每个像素到屏幕的距离。通过“深度比较”,把新的像素与屏幕的距离和已有的最近的像素与屏幕的距离作比较,谁更靠近就画谁。
模型顶点怎么从世界坐标系变换到屏幕面前?
1、顶点坐标乘世界矩阵,把顶点的位置从相对于模型坐标系的位置移动到相对于世界坐标系的位置。
2、顶点坐标乘观察矩阵,把顶点移动到“镜头”前。
3、把顶点补充为四维向量(第四维设置为1),再乘投影矩阵,所谓投影矩阵主要包含了视域、视距等参数,用来把顶点数据变得更容易处理。
也可以把世界矩阵、观察矩阵、投影矩阵按照顺序乘到一起,得到“世界观察投影矩阵”。
然后把顶点补充为四维向量(第四维设置为1),再乘“世界观察投影矩阵”,也可以。
全部处理完了以后,顶点的Z值小于1的顶点被判定在“镜头”的后面。另作处理。Z值不小于1的顶点被判定为位置在“镜头”的前面。这个Z值其实是距离。
将这个顶点的X、Y值除以这个顶点的Z值,得到的X、Y对应屏幕上的坐标是[-1,1]区间的(超出屏幕范围的可能超过这个区间)然后把它的值变换到[0,1]区间并乘以你屏幕的分辨率(注意把Y的值从[-1,1]换到[0,1]区间的时候Y值要取负)。得到的值就是这个顶点在屏幕中的坐标。怎么样?是不是发现异常简单?
光看我这些话可能会让大家觉得没看懂、一头雾水。因此,我用VB编写了一个不用D3D来实现3D显示的实例。虽然只能显示线段,而且没有Z缓冲,但是它已经实现了最基本的3D渲染功能。
程序我尽量用中文编写,以便于让大家读懂。(这里证明了英文才是王道!!!不学英语学编程那是大作死。)
操作方法:WASD平行移动,↑↓←→改变方向,空格键往上方移动,Shift键往下放移动。
因为代码是中文的所以我就不写注释了。。。再次声明这是VB编写的而不是易语言编写的。
源码下载地址:
|
|