首先看一下在iPad上实现的简单的Demo吧: 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函数.其实也可以简单地使用
下面的代码(必须include 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);
//绘图元
........... (完) |