3d物体透光:3d游戏中物体爆炸效果的实现



在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值就能看到效果了当然配合上粒子特效会更酷
Tags:  3d缩小放样物体 3d无法选择物体 3d物体透光

延伸阅读

最新评论

发表评论