【3D】用VB教你最基础的3D图形知识
大家可能认为学会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]区间的(超出屏幕范围的可能超过这个区间)然后把它的值变换到区间并乘以你屏幕的分辨率(注意把Y的值从[-1,1]换到区间的时候Y值要取负)。得到的值就是这个顶点在屏幕中的坐标。怎么样?是不是发现异常简单?
光看我这些话可能会让大家觉得没看懂、一头雾水。因此,我用VB编写了一个不用D3D来实现3D显示的实例。虽然只能显示线段,而且没有Z缓冲,但是它已经实现了最基本的3D渲染功能。
程序我尽量用中文编写,以便于让大家读懂。(这里证明了英文才是王道!!!不学英语学编程那是大作死。)
操作方法:WASD平行移动,↑↓←→改变方向,空格键往上方移动,Shift键往下放移动。
因为代码是中文的所以我就不写注释了。。。再次声明这是VB编写的而不是易语言编写的。
源码下载地址:
**** Hidden Message *****
所以数学基础好才能能编出好程序 事实上DirectX也只是提供了一个数学库、一个显卡加速的渠道而已。OpenGL也差不多。
DOS下的3D游戏编程其实也是这个原理。感兴趣的技术宅们可以试试把我的代码翻译成C语言,然后再添加三角形渲染的代码,就能做“全平台”的游戏啦。
虽说是全平台但是做出的游戏没有显卡加速,因此对CPU要求非常高,至少100000000GHz。这个时候代码的优化就显得至关重要了。 还是我的沙发 系统 发表于 2014-2-20 10:05
还是我的沙发
看到中文我还以为是易语言呢!!! 虽学过数字图像处理,但是看起来还是有点吃力~ 学习一下 学习下。。 太赞了,先下载来研究下 {:soso_e102:} 学习一下…… 谢谢分享 四维单位向量? 0x01810 发表于 2015-3-8 09:30
四维单位向量?
是的。x,y,z,w 估计得捡起许多数学知识...... 啊啊啊啊啊啊啊啊啊 qq18722149390 发表于 2015-7-14 20:09
啊啊啊啊啊啊啊啊啊
水帖警告:删除20积分 11111111111111111111 0.0 23333来学习下3D 本帖最后由 wawzymu 于 2016-1-21 11:00 编辑
楼主,关于Dx 中 GetTransform 获取的M 是什么意思啊?
(百度没有找到很好的解释,是否获得的M11 -M44 和矩阵有关心?)
(我也是用VB的 好亲切啊。。。。。)
.GetTransform D3DTS_WORLD, World
.GetTransform D3DTS_VIEW, View
.GetTransform D3DTS_PROJECTION, Proj
wawzymu 发表于 2016-1-21 10:31
楼主,关于Dx 中 GetTransform 获取的M 是什么意思啊?
(百度没有找到很好的解释,是否获得的M11 -M44 和 ...
M就是Matrix(矩阵)啊。
一个DX的矩阵是由16个浮点数构成的,每4个浮点数是一个四维向量(x,y,z,w)
DX的矩阵可以理解为,前三个向量,是这个矩阵的“坐标轴”,而第四个向量则是这个矩阵的原点的位置。