日志 教程
当前位置: 教程  >  游戏开发  >  游戏动作特效  >  正文

物体爆炸效果的实现

作者:宋姗姗 发表于 2011/6/14 19:26:25     评论(9)     阅读(4205)     

2d画面中常常用一组连续画面效果纹理替换来实现爆炸效果。

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

评论
显示
悄悄话
    李成虎
  • 李成虎的评论:
  •   这 是用程序来实现的吗
    2011-12-03 12:38
    王伟玲
    2011-06-26 21:39
    金勇
    2011-06-26 18:19
    张建可
    2011-06-26 18:00
    袁贵鸿
    2011-06-26 17:30
    杜磊
    2011-06-26 16:03
    谭璐
    2011-06-26 10:42
    黄颖
    2011-06-26 08:21
    永生猫
  • 永生猫的评论:
  •   为啥不直接用粒子效果~
    2011-06-26 05:52
汇众教育官网 | 联系方式 | 版权声明 | 友情链接
Copyright 2008© 汇众益智(北京)教育科技有限公司. All Rights Reserved
京ICP备09092043号 京公网安备11010802009023号