技术宅的结界

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

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 7165|回复: 77
收起左侧

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

  [复制链接]

1020

主题

2262

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17272 个
贡献
34501 次
宅之契约
0 份
在线时间
1636 小时
注册时间
2014-1-26
发表于 2014-2-19 08:02:10 | 显示全部楼层 |阅读模式

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

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

x
大家可能认为学会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编写的而不是易语言编写的。
源码下载地址:
游客,如果您要查看本帖隐藏内容请回复


本帖被以下淘专辑推荐:

1020

主题

2262

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17272 个
贡献
34501 次
宅之契约
0 份
在线时间
1636 小时
注册时间
2014-1-26
 楼主| 发表于 2014-2-19 08:29:51 | 显示全部楼层
事实上DirectX也只是提供了一个数学库、一个显卡加速的渠道而已。OpenGL也差不多。
DOS下的3D游戏编程其实也是这个原理。感兴趣的技术宅们可以试试把我的代码翻译成C语言,然后再添加三角形渲染的代码,就能做“全平台”的游戏啦。
虽说是全平台但是做出的游戏没有显卡加速,因此对CPU要求非常高,至少100000000GHz。这个时候代码的优化就显得至关重要了。

1020

主题

2262

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17272 个
贡献
34501 次
宅之契约
0 份
在线时间
1636 小时
注册时间
2014-1-26
 楼主| 发表于 2014-2-20 10:02:11 | 显示全部楼层
演示视频:
http://www.tudou.com/v/MyGep_Rtn ... _99&tid=0/v.swf

4

主题

29

帖子

285

积分

用户组: 版主

UID
32
精华
0
威望
6 点
宅币
244 个
贡献
0 次
宅之契约
0 份
在线时间
45 小时
注册时间
2014-2-7
发表于 2014-2-20 10:05:06 | 显示全部楼层
还是我的沙发

271

主题

445

帖子

4762

积分

用户组: 真·技术宅

UID
2
精华
61
威望
148 点
宅币
3585 个
贡献
131 次
宅之契约
0 份
在线时间
614 小时
注册时间
2014-1-25
发表于 2014-2-20 20:13:26 | 显示全部楼层

看到中文我还以为是易语言呢!!!

0

主题

19

帖子

51

积分

用户组: 小·技术宅

UID
150
精华
0
威望
1 点
宅币
30 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2014-3-24
发表于 2014-3-24 00:54:50 | 显示全部楼层
虽学过数字图像处理,但是看起来还是有点吃力~

0

主题

1

帖子

16

积分

用户组: 初·技术宅

UID
267
精华
0
威望
1 点
宅币
13 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2014-5-8
发表于 2014-5-8 15:40:42 | 显示全部楼层
学习一下
回复

使用道具 举报

17

主题

41

帖子

521

积分

用户组: 大·技术宅

UID
140
精华
5
威望
30 点
宅币
369 个
贡献
26 次
宅之契约
0 份
在线时间
41 小时
注册时间
2014-3-22
发表于 2014-8-9 10:26:14 | 显示全部楼层
学习下。。
回复

使用道具 举报

2

主题

7

帖子

59

积分

用户组: 小·技术宅

UID
438
精华
0
威望
4 点
宅币
44 个
贡献
0 次
宅之契约
0 份
在线时间
3 小时
注册时间
2014-8-22
发表于 2014-9-7 22:27:19 | 显示全部楼层
太赞了,先下载来研究下

35

主题

131

帖子

4471

积分

用户组: 真·技术宅

Jackeriss.com

UID
21
精华
7
威望
4 点
宅币
2235 个
贡献
2062 次
宅之契约
0 份
在线时间
251 小时
注册时间
2014-1-31

最佳新人活跃会员热心会员

发表于 2014-11-27 19:43:51 | 显示全部楼层

33

主题

34

帖子

561

积分

用户组: 大·技术宅

UID
580
精华
26
威望
28 点
宅币
341 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2014-12-8
发表于 2015-1-13 22:47:40 | 显示全部楼层
学习一下……
回复

使用道具 举报

0

主题

10

帖子

102

积分

用户组: 小·技术宅

UID
681
精华
0
威望
0 点
宅币
92 个
贡献
0 次
宅之契约
0 份
在线时间
12 小时
注册时间
2015-2-13
发表于 2015-3-7 11:20:41 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

76

帖子

6735

积分

用户组: 真·技术宅

UID
604
精华
0
威望
1 点
宅币
804 个
贡献
5853 次
宅之契约
0 份
在线时间
97 小时
注册时间
2014-12-20
发表于 2015-3-8 09:30:06 | 显示全部楼层
四维单位向量?

1020

主题

2262

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17272 个
贡献
34501 次
宅之契约
0 份
在线时间
1636 小时
注册时间
2014-1-26
 楼主| 发表于 2015-3-8 14:55:51 | 显示全部楼层

是的。x,y,z,w

1

主题

4

帖子

22

积分

用户组: 初·技术宅

UID
788
精华
0
威望
1 点
宅币
16 个
贡献
0 次
宅之契约
0 份
在线时间
2 小时
注册时间
2015-4-6
发表于 2015-4-18 16:43:29 | 显示全部楼层
估计得捡起许多数学知识......

0

主题

10

帖子

9

积分

用户组: 初·技术宅

UID
952
精华
0
威望
0 点
宅币
-1 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2015-7-12
发表于 2015-7-14 20:09:08 | 显示全部楼层
啊啊啊啊啊啊啊啊啊

1020

主题

2262

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17272 个
贡献
34501 次
宅之契约
0 份
在线时间
1636 小时
注册时间
2014-1-26
 楼主| 发表于 2015-7-14 22:21:43 | 显示全部楼层
qq18722149390 发表于 2015-7-14 20:09
啊啊啊啊啊啊啊啊啊

水帖警告:删除20积分

0

主题

18

帖子

5128

积分

用户组: 技术宅的结界VIP成员

UID
1183
精华
0
威望
1 点
宅币
5108 个
贡献
0 次
宅之契约
0 份
在线时间
21 小时
注册时间
2015-10-9
发表于 2015-11-12 19:56:00 | 显示全部楼层
11111111111111111111

1

主题

9

帖子

5114

积分

用户组: 技术宅的结界VIP成员

UID
682
精华
0
威望
1 点
宅币
5103 个
贡献
0 次
宅之契约
0 份
在线时间
12 小时
注册时间
2015-2-15
发表于 2016-1-13 19:40:43 | 显示全部楼层
0.0 23333来学习下3D

2

主题

14

帖子

76

积分

用户组: 小·技术宅

UID
1432
精华
0
威望
2 点
宅币
58 个
贡献
0 次
宅之契约
0 份
在线时间
8 小时
注册时间
2016-1-21
发表于 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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-2-19 15:53 , Processed in 0.131191 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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