2d画面中常常用一组连续画面效果纹理替换来实现爆炸效果。
而3d游戏中,我们经常看到被炸飞的石块,怪物被爆裂,效果很酷。他们的模型是三维的,怎么模拟这种效果的呢?熟悉建模的人知道,最精美的模型也是通过三角面片拼接而成。物体爆炸时被肢解成面片,这些面片按一定的方向,从原位置飞四散出去。那么按什么方向才有这种效果呢?对,面的法线方向,而不是顶点法线方向。
首先来计算模型三角面的法线:
//从索引缓冲区中取出面皮顶点的索引号
intp0=pIndex[p];
intp1=pIndex[p+1];
intp2=pIndex[p+2];
//根据索引从顶点缓冲数据区中找到相应的顶点数据
//vAvB是面上的两条线,据此求出面法线
D3DXVECTOR3vA=pVerts[p0].pos-pVerts[p1].pos;
D3DXVECTOR3vB=pVerts[p0].pos-pVerts[p2].pos;
D3DXVECTOR3vFaceNormal;
D3DXVec3Cross(&vFaceNormal,&vA,&vB);
D3DXVec3Normalize(&vFaceNormal,&vFaceNormal);
//重新设置顶点法线。
pVerts[p0].normal=vFaceNormal;
pVerts[p1].normal=vFaceNormal;
pVerts[p2].normal=vFaceNormal;
在vsshader中,更新面片的位置:
vOutputVS_main(veInputIN)
{
vOutputOUT;
float3P=IN.position.xyz+(IN.normal*fNormalZ);//加上偏移量,更新位置。
OUT.T0=IN.texCoordDiffuse;
OUT.HPOS=mul(float4(P,1.0f),worldViewProj);
OUT.color=IN.color;
OUT.normal=IN.normal;
returnOUT;
}
当fNormalZ大到一定值后,让这些爆炸物消失掉,用alpha来过渡,以至于效果不那么突兀。
float4PS_main(vOutputIN):COLOR
{
float4diffuseTexture=tex2D(TextureSampler,IN.T0);
diffuseTexture.a=fAlphaFactor;//alpha渐变1-〉0;
}
在游戏循环中,我们只要恰当的改变shader里的fNormalZ和fAlphaFactor值就能看到效果了,当然配合上粒子特效会更酷。
而3d游戏中,我们经常看到被炸飞的石块,怪物被爆裂,效果很酷。他们的模型是三维的,怎么模拟这种效果的呢?熟悉建模的人知道,最精美的模型也是通过三角面片拼接而成。物体爆炸时被肢解成面片,这些面片按一定的方向,从原位置飞四散出去。那么按什么方向才有这种效果呢?对,面的法线方向,而不是顶点法线方向。
首先来计算模型三角面的法线:
//从索引缓冲区中取出面皮顶点的索引号
intp0=pIndex[p];
intp1=pIndex[p+1];
intp2=pIndex[p+2];
//根据索引从顶点缓冲数据区中找到相应的顶点数据
//vAvB是面上的两条线,据此求出面法线
D3DXVECTOR3vA=pVerts[p0].pos-pVerts[p1].pos;
D3DXVECTOR3vB=pVerts[p0].pos-pVerts[p2].pos;
D3DXVECTOR3vFaceNormal;
D3DXVec3Cross(&vFaceNormal,&vA,&vB);
D3DXVec3Normalize(&vFaceNormal,&vFaceNormal);
//重新设置顶点法线。
pVerts[p0].normal=vFaceNormal;
pVerts[p1].normal=vFaceNormal;
pVerts[p2].normal=vFaceNormal;
在vsshader中,更新面片的位置:
vOutputVS_main(veInputIN)
{
vOutputOUT;
float3P=IN.position.xyz+(IN.normal*fNormalZ);//加上偏移量,更新位置。
OUT.T0=IN.texCoordDiffuse;
OUT.HPOS=mul(float4(P,1.0f),worldViewProj);
OUT.color=IN.color;
OUT.normal=IN.normal;
returnOUT;
}
当fNormalZ大到一定值后,让这些爆炸物消失掉,用alpha来过渡,以至于效果不那么突兀。
float4PS_main(vOutputIN):COLOR
{
float4diffuseTexture=tex2D(TextureSampler,IN.T0);
diffuseTexture.a=fAlphaFactor;//alpha渐变1-〉0;
}
在游戏循环中,我们只要恰当的改变shader里的fNormalZ和fAlphaFactor值就能看到效果了,当然配合上粒子特效会更酷。