找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 52728|回复: 107

【3D】用VB教你最基础的3D图形知识

  [复制链接]
发表于 2014-2-19 08:02:10 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
大家可能认为学会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渲染功能。
程序我尽量用中文编写,以便于让大家读懂。(这里证明了英文才是王道!!!不学英语学编程那是大作死。)
VB3D.PNG
操作方法:WASD平行移动,↑↓←→改变方向,空格键往上方移动,Shift键往下放移动。
因为代码是中文的所以我就不写注释了。。。
再次声明这是VB编写的而不是易语言编写的。
源码下载地址:
游客,如果您要查看本帖隐藏内容请回复


本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2022-11-23 23:18:32 | 显示全部楼层
所以数学基础好才能能编出好程序
回复 赞! 1 靠! 0

使用道具 举报

 楼主| 发表于 2014-2-19 08:29:51 | 显示全部楼层
事实上DirectX也只是提供了一个数学库、一个显卡加速的渠道而已。OpenGL也差不多。
DOS下的3D游戏编程其实也是这个原理。感兴趣的技术宅们可以试试把我的代码翻译成C语言,然后再添加三角形渲染的代码,就能做“全平台”的游戏啦。
虽说是全平台但是做出的游戏没有显卡加速,因此对CPU要求非常高,至少100000000GHz。这个时候代码的优化就显得至关重要了。
回复 赞! 靠!

使用道具 举报

发表于 2014-2-20 10:05:06 | 显示全部楼层
还是我的沙发
回复 赞! 靠!

使用道具 举报

发表于 2014-2-20 20:13:26 | 显示全部楼层

看到中文我还以为是易语言呢!!!
回复 赞! 靠!

使用道具 举报

发表于 2014-3-24 00:54:50 | 显示全部楼层
虽学过数字图像处理,但是看起来还是有点吃力~
回复 赞! 靠!

使用道具 举报

发表于 2014-5-8 15:40:42 | 显示全部楼层
学习一下
回复

使用道具 举报

发表于 2014-8-9 10:26:14 | 显示全部楼层
学习下。。
回复

使用道具 举报

发表于 2014-9-7 22:27:19 | 显示全部楼层
太赞了,先下载来研究下
回复 赞! 靠!

使用道具 举报

发表于 2014-11-27 19:43:51 | 显示全部楼层
{:soso_e102:}
回复 赞! 靠!

使用道具 举报

发表于 2015-1-13 22:47:40 | 显示全部楼层
学习一下……
回复

使用道具 举报

发表于 2015-3-7 11:20:41 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2015-3-8 09:30:06 | 显示全部楼层
四维单位向量?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2015-3-8 14:55:51 | 显示全部楼层

是的。x,y,z,w
回复 赞! 靠!

使用道具 举报

发表于 2015-4-18 16:43:29 | 显示全部楼层
估计得捡起许多数学知识......
回复 赞! 靠!

使用道具 举报

发表于 2015-7-14 20:09:08 | 显示全部楼层
啊啊啊啊啊啊啊啊啊
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2015-7-14 22:21:43 | 显示全部楼层
qq18722149390 发表于 2015-7-14 20:09
啊啊啊啊啊啊啊啊啊

水帖警告:删除20积分
回复 赞! 靠!

使用道具 举报

发表于 2015-11-12 19:56:00 | 显示全部楼层
11111111111111111111
回复 赞! 靠!

使用道具 举报

发表于 2016-1-13 19:40:43 | 显示全部楼层
0.0 23333来学习下3D
回复 赞! 靠!

使用道具 举报

发表于 2016-1-21 10:31:10 | 显示全部楼层
本帖最后由 wawzymu 于 2016-1-21 11:00 编辑

楼主,关于Dx 中 GetTransform 获取的M 是什么意思啊?
(百度没有找到很好的解释,是否获得的M11 -M44 和矩阵有关心?)
(我也是用VB的 好亲切啊。。。。。)

.GetTransform D3DTS_WORLD, World
.GetTransform D3DTS_VIEW, View
.GetTransform D3DTS_PROJECTION, Proj
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2016-1-21 18:26:56 | 显示全部楼层
wawzymu 发表于 2016-1-21 10:31
楼主,关于Dx 中 GetTransform 获取的M 是什么意思啊?
(百度没有找到很好的解释,是否获得的M11 -M44 和 ...

M就是Matrix(矩阵)啊。
一个DX的矩阵是由16个浮点数构成的,每4个浮点数是一个四维向量(x,y,z,w)
DX的矩阵可以理解为,前三个向量,是这个矩阵的“坐标轴”,而第四个向量则是这个矩阵的原点的位置。
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-21 22:50 , Processed in 0.045520 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表