没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
坐标系
在 里使用的坐标系是左手坐标系,就是当你看屏幕时,左手边是 轴的负方向,右手边是 轴的正
方向。屏幕下边是 轴的负方向,屏幕上边是 轴的正方向。远离屏幕是 轴的负方向,指向屏幕里面
是 轴的正方向。
坐标系还有右手坐标系,还有其它各种各样的坐标系。如果需要从其它坐标里的图形显示在 里,就
需要进行转换。
点
在三维空间里表示物体位置,就需要用坐标来表示。由上面的坐标系可知,任何一点,都可以用三个坐标
轴的值来表示。比如表示零点,就是 (,,)。只要给出三个坐标轴的值,就可以知道这个点在什
么位置了。
从坐标系里,就知道我们定义的坐标轴是有方向的。那么在坐标系里的点,是否也有方向呢?为了表示方
便,使用起来简单,在 里的点也是有方向的。用向量来表一个点的位置和方向。一个点的方向,都
是从原点出发指向这点的方向。比如下面的图中, 就是一个点的位置和方向。
从几何上知道这种表示方法了,但在程序里是怎么样表示一个向量呢?在编程里,是需要特定的编程语言
来表达向量的。由于 ++具有强大的功能和特别快的处理速度,目前大部份游戏都是采用 ++来编写。
因此 游戏也不例外地采用 ++。如果你还不会使用 ++,建议你先去找本 ++的书来看看,
然后再接着看本书,否则很多东西是看不懂的。
在 ++里是使用结构()或者类来表达一个向量的。下面就是 里的向量表示方法:
!
"#$%
"#%
"#&%
' %
向量定义了三个成员 $((& 来表示坐标系三个坐标轴的值。这里使用 来定义向量
类型,以后就可以使用它来定义其它向量类型变量了。为了方便对它的操作,因此又需要继承它,生成一
个新类 。 类有很多方法,使用起来非常方便。因而在程序里,主要
使用它来定义变量,这样就有很函数可以使用了。比如赋值,相加,相减等等。它的定义如下:
)*+
!
*+)
!'%
,-./0%
,- 1%
,-./20%
./$(./(./&%
33+45
##./0%
##,-./0#4%
33+5464##
1##78,- 1%
1##98,- 1%
1##08./%
1##38./%
334##
##7#4%
##9#4%
33*+4##
##7,- 1#4%
##9,- 1#4%
##0./#4%
##3./#4%
+4 ##0./(,- 1%
:/##88,- 1#4%
:/##;8,- 1#4%
' (0/< %
在这里已经实现向量的加减、数乘、数除,也许你发现这里有没有点积和叉积运算。它们是通过其它公共
函数实现的。说到这里,如果你对点积和叉积运算不是很懂,看来又需要去看看《向量代数》了。在游戏
里,要表示一个人沿着 的方向行走,那么只需要对着 向量数乘,就可以了。有了这样的向量类型
定义,就可像下面那样方便使用:
=((%
平面的表示
空间里的物体都是实体的(主要由平面组成。比如正方体,就有 2 个平面。在 里组成三维物体的
基本平面是三角形,无论是多么复杂的物体,都是有三角形组成的。并且 里支持显示最小的图形也
是三角形,它是没有点和直线显示的。因此,要显示正方体,就需要把每个平面分成两个三角形,才能显
示。如下图所示:
为什么选择三角形作为 里最小的平面呢?由于三个点组成的平面,肯定是共面的,是平坦的,并且
显示效率是最高的。如果选择其它多边形的话,就存在点不共面的情况,这样变得非常复杂,所以目前显
示卡也是针对三角形进行优化显示的。
要在 里显示物体,就是显示很多的三角形,让这些三角形连接起来,就组成游戏里的人体,动物,
武器等等。在几何里就知道每个三角形都有三个顶点组成,那么只要设置了三个顶点的值,就可以在
里显示三角形出来了。用 里的向量表示三个顶点就是:
) 9(9(%
:) ((%
) (9(%
只要把所有三角形的顶点,都按上面格式设置到顶点缓冲区里,就可以显示一个三角形出来。但这个三角
形又可分为两个表面:前表面和后表面。在 缺省情况下,只会显示前表面。那么怎么样来区别前表
面和后表面呢?由于 是采用左手坐标系,正对着平面看去是顺时针方向的顶点顺序就是前表面。如
下图所示:
如果不小心把顶点的顺序搞反,就会看不到表面显示。并且还会关系到后面的灯光显示,纹理显示。
其实,前表面就是平面的法向量指向的表面。
只要认识到组成平面的顶点以及顶点排列顺序,就可以用平面构成三维物体了。不管多么复杂的物体,都
可以由顶点组成平面,再有平面组成物体。不管是圆的物体,还是方的物体,都可以使用三角形去组成。
其实这种三维物体是数字化的,永远都是尽可能逼近,不可能是完全相同的。比如要显示一个足球,它是
圆的,需要非常多的三角形去构成它,但不可能完全一样的。并且使用过多的三角形,就会导致 <> 或
者 ?<> 处理不过来。在目前的个人电脑里,虽然处理三角形的速度快了很多,但真的要显示大量三角形 ,
还是不行的。
使用 +
最简单三角形显示
前面已经学习了顶点、平面以及平面的法向量。接着下面就带你进入奇幻的 世界,由你去创造这个美
好的 世界。任何美好的事物都是简单的东西组成的,所以也需要从最简单的物体构造开始。这里主要
显示一个三角形,其它关于窗口和初始化 的设备都已经由 @@ 引擎做好了,目前只要设置顶点、
世界坐标变换矩阵、观察变换矩阵、投影变换矩阵,然后渲染这个三角形,就可以显示屏幕里了。最终显
示效果如下图:
、 顶点格式
顶点格式是可变的,是灵活的。由前面可知,顶点肯定是有三个值的,就是三个坐标轴的值。下面先来看
看最简单的顶点格式,它定义如下:
33定义顶点缓冲区里用到的顶点格式。
A A,?/
!
=<#++#4%33顶点位置。
+#4B C..8..%
'%
这里使用一个结构来定义顶点的格式,后面就可使用这个结构来定义顶点了。看到这个结构里第一个成员
=<#++#4 是很熟悉的吧,前面已经说明过使用一个向量来表示一个顶点的。最简单的顶点格式,就是只
有一个向量值,其它什么也没有。后面一个成员 C.. 是说明顶点的有什么样数据,这里只有顶点的坐
标,所使用了宏定义 ..。其实顶点还可以有其它数据在里面的,比如要表示这个顶点的法向
量,就需要加入法向量的成员,比如要显示纹理在这个表面上,就需要设置纹理坐标。
、 顶点缓冲区
顶点的数据是怎么样保存在内存里的呢?由于渲染需要,就要把顶点保存在内存缓冲区里。最简单的
方法就是使用 提供的顶点缓冲区,即是使用 A+$:DE 接口的顶点缓冲区管理,
它是通过 的设备来创建。这个接口实现顶点的资源管理,使用起来非常方便,由于它管理内存
分配,这样就省了内存管理。下面就是通过 A+=+E))$:D 函数来创建
一个顶点缓冲区:
F ->/G%
33创建顶点缓冲区。
+.A/G86=+9H$:D00+&#A A,?/(
(A A,?/))C..(
</@,?(16:(,>//
!
33创建顶点缓冲区失败。
4 I$:DI(G%
'
上面这段代码,就是创建 2 个顶点的缓冲区。指定的格式为 A A,?/))C..,这个在
前面已经定义过,只包括顶点向量数据。</@,? 指明了创建的缓冲区在系统内存
里,并且需要时就拷贝到显示卡内存里。我们知道显示卡内存越来越大了,如果把很多变化不大的物
体放到显示卡内存里,就可以加速显示,减少占用系统局部总线的带宽。像 , 新出来的显示卡,都
有 ? 显示内存,显然可以放更多物体在那里,以便显示的速度更快。
由于显示卡内存和系统内存的复杂性,而通过这个接口可以方便地使用了。由于它是还一个内存池,
所以产生内存碎片的机会就更加少了。
创建顶点缓冲区之后,就需要往里面填充顶点数据,先来看看下面的代码:
33用两个三角形填充顶点缓冲区。
A A,?/0+%
+.A/G86:9H/#J((A001+(
!
33锁住顶点缓冲区。
4 I/#JI(G%
'
33前面三角形。
+KL=<#++#48 9(9(%M
+KL=<#++#48 ((%M
+KL=<#++#48 (9(%
33后面三角形。
+KL=<#++#48 9(9(%M
+KNL=<#++#48 (9(%
+KOL=<#++#48 ((%
33解锁顶点缓冲区。
6:9H>4#J%
这段代码是通过 A+$:DE))/#J 方法来获取到顶点缓冲区的指针,然后把 2 个顶
点赋值。最后调用 A+$:DE))>4#J 方法解锁,如果不解锁, 显示不了这个
缓冲区里的数据,就会出错的,所以一定要小心地操作。
、 世界坐标变换矩阵
在设置顶点缓冲区之后,就需要设置物体的世界坐标变换矩阵。从解析几何里可以知道,无论二维还
是三维的图像都可以通过齐次坐标来变换的。目前在三维里的变换,采用的矩阵是 NPN 的矩阵来实
现变换处理。在 里定义 @ A 类型,使用它来表达一个矩阵,并且定义一系列的函
数可以实现矩阵的运算。它的定义如下:
@ A!
4+#4!
!
"#(((N%
"#(((N%
"#(((N%
"#N(N(N(NN%
'%
"#6KNLKNL%
'%
'@ A%
上面代码定义了 NPN 矩阵的四个元素,全部使用浮点数运算。接着还添加了一些操作方法,如下:
@ A)*+@ A
!
*+)
@ A!'%
@ A,-./0%
@ A,-@ A1%
@ A,-./20%
@ A./(./(./(./N(
./(./(./(./N(
./(./(./(./N(
./N(./N(./N(./NN%
3354
./1##>A, #C(>A,#%
./##>A, #C(>A,##4%
33+45##
##./0%
##,-./0#4%
33+5464##
@ A1##08,-@ A1%
@ A1##78,-@ A1%
@ A1##98,-@ A1%
@ A1##08./%
@ A1##38./%
剩余26页未读,继续阅读
资源评论
- aqua20132012-11-14这就是个片段,骗分的
junco007
- 粉丝: 2
- 资源: 26
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功