3d游戏技术:3D游戏中的公告牌技术



公告牌技术,即billboard技术,在3D游戏中有着广泛应用.它本质就是用预先做好几幅
位图来代替3D物体,极大地节省资源和提高速度.仔细观察<<魔法门>>系列游戏,它精灵,树木,物
品都是 2维图象,但由于它始终朝向观察者,你根本看不到它""面,所以给人种立体感觉.
这种技术最大优点是快.试想个多边形构成3D精灵,至少百余个多边形,而用billboard技术,
只需处理两个多边形,优势不言而喻.其他3D游戏爆炸效果,<<极品飞车>>中路旁树木,都使用了
该技术.

实现该技术两个关键步骤:
1.在合适地方,朝合适方向放位置"公告牌".这个公告牌,其实是个共面 4边形,般使用
矩形.
2.把位图贴到矩形上.       
1.方向计算:
如果是做爆炸效果,要求该矩形法向量始终指向观察者眼睛,设矩形法向量和Z轴重合,可
以用以下代码获得其旋转矩阵:
D3DVECTOR vEyeLoc; //观察者眼睛位置
D3DVECTOR vLoc; //公告牌位置
D3DVECTOR vAxis; //转轴
float fRads; //旋转角
D3DMATRIX matRotate; //旋转矩阵 
//赋值语句略去......
D3DVECTOR v=vEyeLoc-vLoc;//从放置点指向视点矢量
vAxis=CrossProduct(Normalize(v),D3DVECTOR(0,1,0));//用叉积求转轴
fRads=asin(Magnitude(vAxis));//该叉积反正玄正好是旋转角
D3DUtil_SetRotationMatrix(matRotate,vAxis,fRads); //设置旋转矩阵 
如果是做精灵,树木等,要求该矩形法向量始终指向观察者且和地面平行,则更简单:
D3DVECTOR v=vEyeLoc-vLoc;//从放置点指向视点矢量
vAxis=CrossProduct(Normalize(v),D3DVECTOR(0,1,0));//用叉积求转轴
D3DUtil_SetRotationMatrix(matRotate;,vAxis,g_PI/2.0); //g_PI=3.1415926
2.贴图方式:
贴图方式有两种,是用颜色键,是用Alpha.前者适合做精灵和树木等,后者适合做爆炸效果.
a)对于颜色键思路方法,如果是调色板表面,需要设置调色板;如果是高彩或真彩表面,需要逐点设置
Alpha信息.具体可参照d3dtextr.cpp里CopyBitmapToSurface.其实也可以简单地使用
下面代码(必须 d3dtextr.h):
//创建纹理,白色为透明色
D3DTextr_CreateTexture( "texture.bmp", 0, D3DTEXTR_TRANSPARENTWHITE);
......
//打开Alpha
pd3dDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
//设置纹理层参数
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
//设置混合因子
pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND,D3DBLEND_ZERO);
//绘图元
...........
b)直接使用Alpha.如果做是爆炸效果,当然爆炸边缘是半透明,可以如下设置:
//假设你爆炸位图以黑色为背景
//打开Alpha
pd3dDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE,TRUE );
//设置混合因子
pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND,D3DBLEND_ONE);
//绘图元
...........
(完)
Tags:  3d游戏技术

延伸阅读

最新评论

发表评论