在3d游戏中我们经常看到被炸飞石块怪物被爆裂效果很酷他们模型是 3维如何模拟这种效果呢?熟悉建模人知道最精美模型也是通过 3角面片拼接而成物体爆炸时被肢解成面片这些面片按定方向从原位置飞 4散出去那么按什么方向才有这种效果呢? 对面法线方向而不是顶点法线方向
首先来计算模型 3角面法线:
// 从索引缓冲区中取出面皮顶点索引号
p0 = pIndex[p];
p1 = pIndex[p+1];
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_(veInput IN)
{
vOutput OUT;
float3 P = IN.position.xyz + (IN.normal * fNormalZ); //加上偏移量更新位置
OUT.T0 = IN.texCoordDfuse;
OUT.HPOS = mul(float4(P, 1.0f), worldViewProj);
OUT.color = IN.color;
OUT.normal = IN.normal;
OUT;
}
当fNormalZ大 到定值后让这些爆炸物消失掉用alpha来过渡以至于效果不那么突兀
float4 PS_( vOutput IN): COLOR
{
float4 dfuseTexture = tex2D( TextureSampler, IN.T0 );
dfuseTexture.a = fAlphaFactor; //alpha 渐变 1-〉0;
}
在 游戏循环中我们只要恰当改变shader里 fNormalZ 和fAlphaFactor值就能看到效果了当然配合上粒子特效会更酷
最新评论