Billboard技术浅析

Billboard技术浅析,第1张

概述3D游戏中的公告牌技术 首先看一下在iPad上实现的简单的Demo吧: 公告牌技术,即billboard技术,在3D游戏中有着广泛的应用.它的本质就是用预先做好的几幅 位图来代替3D物体,极大地节省资源和提高速度.仔细观察<<魔法门>>系列游戏,它的精灵,树木,物 品都是二维图象,但由于它始终朝向观察者,你根本看不到它"扁"的一面,所以给人一种立体的感觉. 这种技术最大的优点是快.试想一个多边形构 @H_419_25@ @H_419_25@
@H_419_25@

3D游戏中的公告牌技术

@H_419_25@
@H_419_25@
 
首先看一下在iPad上实现的简单的Demo吧:
 公告牌技术,即billboard技术,在3D游戏中有着广泛的应用.它的本质就是用预先做好的几幅 位图来代替3D物体,极大地节省资源和提高速度.仔细观察<<魔法门>>系列游戏,它的精灵,树木,物 品都是二维图象,但由于它始终朝向观察者,你根本看不到它"扁"的一面,所以给人一种立体的感觉. 这种技术最大的优点是快.试想一个多边形构成的3D精灵,至少百余个多边形,而用billboard技术,只需处理两个多边形,优势不言而喻.其他3D游戏的爆炸效果,<<极品飞车>>中路旁的树木,都使用了 该技术. 实现该技术的两个关键的步骤: 1.在合适的地方,朝合适的方向放位置一面"公告牌".这个公告牌,其实是一个共面四边形,一般使用 矩形. 2.把位图贴到矩形上. 
1.方向的计算: 如果是做爆炸效果,要求该矩形的法向量始终指向观察者的眼睛,设矩形的初始法向量与Z轴重合,可 以用以下代码获得其旋转矩阵:
@H_502_79@D3DVECTOR vEyeLoc; //观察者眼睛的位置 D3DVECTOR vLoc; //公告牌位置 D3DVECTOR vAxis; //转轴 float fRads; //旋转角 D3DMATRIX matRotate; //旋转矩阵 
@H_502_79@//赋值语句略去......
@H_502_79@D3DVECTOR v=vEyeLoc-vLoc;//从放置点指向视点的矢量 vAxis=Crossproduct(normalize(v),D3DVECTOR(0,1,0));//用叉积求转轴 fRads=asin(Magnitude(vAxis));//该叉积的模的反正玄正好是旋转角
@H_502_79@D3DUtil_SetRotationMatrix(matRotate,vAxis,fRads); //设置旋转矩阵 
如果是做精灵,树木等,要求该矩形的法向量始终指向观察者且与地面平行,则更简单:
@H_502_79@D3DVECTOR v=vEyeLoc-vLoc;//从放置点指向视点的矢量 vAxis=Crossproduct(normalize(v),0));//用叉积求转轴 D3DUtil_SetRotationMatrix(matRotate;,g_PI/2.0); //g_PI=3.1415926
2.贴图的方式: 贴图的方式有两种,一是用颜色键,一是用Alpha.前者适合做精灵和树木等,后者适合做爆炸效果.
a)对于颜色键方法,如果是调色板表面,需要设置调色板;如果是高彩或真彩表面,需要逐点设置 Alpha信息.具体可参照d3dtextr.cpp里的copyBitmapToSurface函数.其实也可以简单地使用 下面的代码(必须include d3dtextr.h):
@H_502_79@//创建纹理,白色为透明色 D3DTextr_CreateTexture( "texture.bmp",D3DTEXTR_transparentWHITE);
@H_502_79@......
@H_502_79@//打开Alpha pd3dDevice->SetRenderState( D3DRENDERSTATE_AlphaBLENDENABLE,TRUE );
@H_502_79@//设置纹理层参数 pd3dDevice->SetTextureStageState( 0,D3DTSS_AlphaOP,D3Dtop_SELECTARG1); pd3dDevice->SetTextureStageState( 0,D3DTSS_AlphaARG1,D3DTA_TEXTURE);
@H_502_79@//设置混合因子 pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND,D3DBLEND_ONE); pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND,D3DBLEND_ZERO);
@H_502_79@//绘图元 ...........
b)直接使用Alpha.如果做的是爆炸效果,当然爆炸的边缘是半透明的,可以如下设置:
@H_502_79@//假设你的爆炸的位图以黑色为背景
@H_502_79@//打开Alpha pd3dDevice->SetRenderState( D3DRENDERSTATE_AlphaBLENDENABLE,TRUE ); //设置混合因子 pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND,D3DBLEND_ONE); //绘图元 ...........
(完)
总结

以上是内存溢出为你收集整理的Billboard技术浅析全部内容,希望文章能够帮你解决Billboard技术浅析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1091650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存