DirectX3D游戏制作之---3D场景的渲染及人物动画的显示

前言:

            无所谓好或不好,人生一场虚空大梦,韶华白首,不够转瞬。

                                                                                                         ----慕容紫英《仙剑奇侠传四》

PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示

                                         个人认为可以了解的内容-------紫色字体显示

---------------------------------------------------------------------------------------------------------------------------------------------

       不知不觉就已进入八月了,由于之前没什么时间,所以好久没写博客了,这两个比较空,因此就来写一写关于3D的文章,当然要得到最终的效果需要所用到DirectX库,我们可以下载一个开发工具包DirectX SDK(Microsoft DirectX SDK 是DirectX编程的软件。包含了开发尖端多媒体应用软件不可或缺的开发工具,以及runtime、headers及程序库、范例执行文件、文件、DirectX工具、并且同时支援C++ 以及 Visual Basic开发软件),虽然说已经更新了好多个版本,但是最经典的还是DirectX 9.0版本,其实主要是这个版本可参考的资料比较多,如果你学习最近版本的,那么很有可能你需要看一些外国文章,这对于不喜欢读英文的人来说太痛苦了,因此我们不要一味的赶时髦学习一些最新的技术,从基础开始,循序渐进。而且最重要的是DirectX 9.0版本有最经典的红龙书可以参考!

       如果需要下载这个开发工具包,以下是链接:传送门

       好了废话不多说了,我们开始正式的内容,这次要说的内容有两个,一个是3D场景的渲染,另一个就是骨骼动画的显示。(PS:代码较长,文章之中只给出了实现思路,如果需要完整的代码,可以留下邮箱或者私信我!

首先我们来看一下实际的效果吧:

先来看一一个场景大体的轮廓:


      

       再来看一看地形以及天空(这里说明一下,为了观察方便,我这里选取的天空盒边长比较小,所以很容易看出是方形的天空盒,不过边长设置大些的话,就很难看出了)

          

          最后在来看一下跳舞的妹子吧!(如果配上Noboby歌曲,是不是很配呢?)



看完之后我们就来分析一下,按顺序来吧。

                                                            3D场景的渲染

        虽然说3D只是在2D的基础之上多加了一个维度,但是难度大的不是一点点。而在3D编程的学习之中最重要的就是3D场景的渲染,当然这也是也是最基本的。如果说2D的编程是贴图的艺术,那么3D编程肯定是渲染的艺术,所以说渲染是3D编程之中最重要的也是最基本的技能。关于3D的渲染,首先你会想要给那个生成的窗口添加什么内容,首先是天空,然后是地形,当然还有必不可少的具体场景画面,这三者一般来说是每个场景都有。好了既然决定了要做什么,那么我们就可以着手去实现它,对于这几者我们都可以将其封装在一个类之中,因为场景的实现这几个必不可少,所以封装在一个类之中后我们可以很方便的调用,我们一个一个来看:

                                                      渲染之地形的实现

       关于这部分,我们先从最简单的地形入手,最简单的地形当然是类似于那种一望无际,可以想象成一个大平原,周围很空旷,那么这样的地形只需要绘制一个大的三角形网格组成的大的矩形区域就可以了,其实这就是一个二维的平面,那么怎么能让二维的平面转化为三维的平面?

       其实简单一点可以想象为原本是一个大的网格平面,如果你把其中的某一些点往上提一下,或者把某些点往里压一些,那么此时做出来的效果就有一些立体感了,但是还不够明显。不过很明显的感受就是,原本在第一种方式下,我们只需要用(x,y)坐标描述每一个坐标即可,但是在我们在这种方式下如果我们需要描述每一个点的时候就要使用(x,y,z)三维坐标,z坐标代表高度,这样写出来的效果虽然不明显,但是至少比原来的好多了,至少有了立体感。这种方式实现三维地形图的过程之中还涉及到一个关于高位图的概念,什么是高度图呢?其实说白了就是一组连续的数组,在这个数组之中的元素与地形网格中的顶点一一对应,而且每一个元素都指定了地形网格的某个顶点的高度值。

        顺便提一点,在高度图中,高度值表现为0 ~ 255之间的明暗值。高度图技巧的使用方法就是:首先,将想要制作的三维地形制作为只包含二维高度信息的高度图,然后,利用高度图信息重新制作为三维地形(terrain)。

        当然简单的说一下高度图的制作原理,高度图的主要原理就是将二维信息转变为三维顶点信息,一般情况下,二维xy平面空间在三维图形中对应的是xz平面。其核心原理是:将二维(x ,z)坐标所对应的像素亮度值换算为三维(x, y, z)坐标中的y值,因此,大部分情况下,高度图只包含256色亮度值的黑白图片文件。【二维图形中的亮度值可用来表示三维空间中的高度值】

       高位图有很多实现的方式,其中最常用的一种就是灰度图。地形之中某一点的海拔越高的话,相应地该点对应的灰度图中的亮度就越大。上面也说了地形之中最低点将使用0表示,而最高点使用255表示(不过要是遇到一个地形之中大部分的区域的高度都差不多情况下,只有少数地方高度差别很大,这时候可能会有一些小问题

       接下来还是说一说用什么方式可以制作一张高度图,一般来说有两种方式:

方式一:采用某种算法为基础,写个程序生成,拿出一个伪代码吧,这部分伪代码对应的是InitVB()函数。利用纹理对象读取高度图信息之后,调用LockRect()函数获取存储器的固定指针进行访问。该方法就是光影贴(lightmapping)技术中所使用的必须技术。调用LockRect()函数后,将纹理的长度和存储器的指针存储在名D3DLOCKED_RECT的结构体中,通过结构体的成员参数中的pBits参数可以访问纹理的像素单位。


                
  • 20
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 120
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 120
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值