物体爆炸效果如何实现

机构:郑州鬼谷门教育 时间:2016-01-03 点击:758

  而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值就能看到效果了,当然配合上粒子特效会更酷。

  更多资讯,请访问郑州游戏设计培训学校

返回顶部