而3d游戏中,我们经常看到被炸飞的石块,怪物被爆裂,效果很酷。他们的模型是三维的,怎么模拟这种效果的呢?熟悉建模的人知道,最精美的模型也是通过三角面片拼接而成。物体爆炸时被肢解成面片,这些面片按一定的方向,从原位置飞四散出去。那么按什么方向才有这种效果呢? 对,面的法线方向,而不是顶点法线方向。
首先来计算模型三角面的法线:
// 从索引缓冲区中取出面皮顶点的索引号
int p0 = pIndex[p];
int p1 = pIndex[p+1];
int p2 = pIndex[p+2];
//根据索引从顶点缓冲数据区中找到相应的顶点数据
//vA vB是面上的两条线,据此求出面法线
D3DXVECTOR3 vA = pVerts[p0].pos - pVerts[p1].pos;
D3DXVECTOR3 vB = pVerts[p0].pos - pVerts[p2].pos;
D3DXVECTOR3 vFaceNormal;
D3DXVec3Cross( &vFaceNormal, &vA, &vB );
D3DXVec3Normalize( &vFaceNormal, &vFaceNormal );
//重新设置顶点法线。
pVerts[p0].normal = vFaceNormal;
pVerts[p1].normal = vFaceNormal;
pVerts[p2].normal = vFaceNormal;
在vs shader 中,更新面片的位置:
vOutput VS_main(veInput IN)
{
vOutput OUT;
float3 P = 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;
return OUT;
}
当fNormalZ大 到一定值后,让这些爆炸物消失掉,用alpha来过渡,以至于效果不那么突兀。
float4 PS_main( vOutput IN): COLOR
{
float4 diffuseTexture = tex2D( TextureSampler, IN.T0 );
diffuseTexture.a = fAlphaFactor; //alpha 渐变 1-〉0;
}
当然了,在游戏循环中,我们只要恰当的改变shader里的 fNormalZ 和fAlphaFactor值就能看到效果了,当然配合上粒子特效会更酷。
更多资讯,请访问郑州游戏设计培训学校