查看: 4838|回复: 1
打印 上一主题 下一主题

【Away3D初级教程】粒子系统

[复制链接]

3795

主题

2

听众

5万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
53202
精华
32

活跃会员 优秀版主 推广达人 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2013-1-6 14:38:51 |只看该作者 |倒序浏览
介绍
在Away3D 4.1 Alpha版本包括一个强大的和可配置的API创建高性能的,基于GPU的粒子系统的能力。有了它的帮助,可以很容易地实现令人难以置信的效果,在您的3D项目。以下教程向您介绍的API的基本概念,包括粒子几何体类,动画init函数控制粒子的生活和行为方式的设置。粒子几何
首先,我们所需要的颗粒是一组几何形状。将代表这个集合的每个元素的粒子。您可以使用集合中的任何几何形状,一个内置的几何原始提供的Away3D中或从文件加载的外部几何形状。不过,我们建议您不要使用大量的顶点的几何,因为它会导致沉重的负荷性能。你可能会问为什么是预定义,而不是像其他一些粒子系统在飞行中产生的几何集。这是的局限性放在顶点缓冲区上传,如果动态添加需要更加频繁地发生。上传的顶点缓冲区进行的性能成本,所以是一个事件,这是最好的最小化,并且除了一个动态粒子的几何形状有限制,在不同的动画实例共享的顶点缓冲区的可能性。在我们的例子中,我们将使用CubeGeometry,我们的几何集的元素。看到这样的代码片段:var cube:Geometry = new CubeGeometry(10, 10, 10);
var geometrySet:Vector.<Geometry> = new Vector.<Geometry>;
for (var i:int = 0; i < 1000; i++)
{
    geometrySet.push(cube);
}在这里,我们增加了1000的立方体几何形状到我们的几何。如果需要的话,你可以混合在一起的不同种类的几何形状相同的几何形状的集合。一旦我们完成,我们使用粒子帮手API的最终颗粒的几何形状,把我们设置为:

var particleGeometryarticleGeometry = ParticleGeometryHelper.generateGeometry(geometrySet);我们有我们的最终粒子几何体实例,准备好动画。
粒子寿命
接下来,我们需要创建一个粒子动画集。您可能已经熟悉的粒子寿命周期的概念。在传统的粒子系统,粒子都有其生命周期价值,通过其他属性(颜色,位置等)进行控制。在Away3D,一个粒子具有的startTime属性相关的系统时间和一个可选的持续时间(如果没有遇到的持续时间,粒子将具有无限的持续时间)。也有延迟属性(也可选),这表示颗粒的持续时间和结束的另一持续时间的开始之间的延迟时间。这些物业投入使用时,粒子将出现在它的开始时间,将活着的持续时间,延误时间,然后消失。由于这些属性里面的GPU代码的时间计算的基础,我们必须预先定义将被使用的。见的ParticleAnimationSet的构造函数,第一个参数表示是否我们将可以用粒子的时间属性,第二个表示是否我们将使用一个循环颗粒的时间表(所以那一次的粒子已经完成它的周期,它会自动启动一个新的,和第三个表示的粒子是否会消失的延迟时间,然后再重新启动他们的周期,在这个例子中,我们设置了全部三个属性为***e。下面的代码:var animationSetarticleAnimationSet = new ParticleAnimationSet(***e, ***e, ***e);接下来,你可能会问,我们如何设置这些时间相关的属性?如果我们将它们设置为一个属性的动画集,所有的粒子都具有相同的属性,在相同的时间出现和消失。相反,我们使用一个功能,那让我们可以单独设置每个粒子的属性。这些是已知的由于事实上,他们是每个粒子的局部的,但只设置了一次一个本地的静态属性。每一个粒子,该函数将被调用。您可以识别的粒子::使用的ParticleProperties的指数值的索引,然后设置的ParticleProperties ::的startTime,ParticleProperties ::时间和ParticleProperties ::延迟值的粒子。我们写的代码是这样的:animationSet.initParticleFunc = initParticleParam;
private function initParticleParam(proparticleProperties):void
{
    prop.startTime = prop.index * 0.005;
    prop.duration = 10;
    prop.delay = 5;
}你可能已经猜到了,通过这样做,我们已经建立了一套本地的静态属性,这将导致颗粒开始周期5毫秒,是活着的10秒,然后睡着了5秒。OK!
粒子的位置
在这一点上,你可能会问,如果有一个发射器可以控制每个粒子的原始位置,其他一些粒子系统吗?没有,有没有emmiter。让我们我们忘记的emmiter,我们可以实现相同的功能,更有效地通过行为的粒子API中最重要的概念之一。我们开始在ParticlePositionNode。它可以控制每个粒子在ParticleGeometry的位置。的性质决定通过其控制的模式属性在类的构造。这可以采取三种不同的值:ParticlePropertiesMode.LOCAL_STATIC(颗粒可以具有不同的起始的行为属性),ParticlePropertiesMode.GLOBAL(所有粒子具有相同的起始性能)或ParticlePropertiesMode.LOCAL_DYNAMIC(颗粒可以具有不同的性质,在飞行控制)。LOCAL_STATIC模式和全球模式是非常高的性能,并且可以共享整个动画实例的GPU资源。其结果是,它是推荐的,我们使用这两种模式下尽可能多。在这种情况下,我们会选择ParticlePropertiesMode.LOCAL_STATIC模式:animationSet.addAnimation(new ParticlePositionNode(ParticlePropertiesMode.LOCAL_STATIC));现在,我们可以控制的位置值,通过在init函数:private function initParticleFunc(proparticleProperties):void
{
    prop.startTime = prop.index * 0.005;
    prop.duration = 10;
    prop.delay = 5;
    //calculate the original position of every particle.
    var percent:Number = prop.index / prop.total;
    var r:Number = percent * 1000;
    var x:Number = r*Math.cos(percent * Math.PI * 2 * 20);
    var z:Number = r*Math.sin(percent * Math.PI * 2 * 20);
    param[ParticlePositionNode.POSITION_VECTOR3D] = new Vector3D(x, 0, z);
}我们可以预览效果之前,我们要创建的材料,网格和动画对象的粒子。采用相同的方法在Away3D其他形式的动画。(点击图片去预览效果)。源代码在附件——图一源代码。
粒子速度
接下来,让我们的粒子移动。对于这一点,我们将使用另一种行为,ParticleVelocityNode。我们知道,我们应该可以使用LOCAL_STATIC的或全球尽可能地为我们的模式。 但是,它们之间的区别是什么?内部,LOCAL_STATIC的模式使用寄存器的流,将数据传递到GPU,以使数据可以表示每粒子。然而,全球模式使用固定的寄存器来传递数据,每行为。可用的流寄存器的数量是比常量寄存器的数量少,流寄存器需要更多的数据和更多的初始化时间。因此,作为一项规则,我们应该尝试使用全球模式在可能的情况下。在我们的例子中,我们希望所有的粒子以相同的速度移动。这意味着模式可用于ParticlePropertiesMode.GLOBAL。 代码看起来是这样的:animationSet.addAnimation(new ParticleVelocityNode(ParticlePropertiesMode.GLOBAL, new Vector3D(0, 50, 0)));
OK,让我们预览了!(点击图片去预览效果)。源代码在附件——图二源代码。
总结和先进的演示
我们的第一个例子就完成了。我们已经看到了如何创建粒子的几何形状,如何设置单个粒子的开始时间和位置属性,以及如何使他们走动。当然,有很多这样的功能还没有被覆盖,但我们都必须从某个地方开始。现在,您可以使用这些功能来建立非常真棒!不相信我们?看一看,只能通过使用在本教程中提到的功能是实现这种先进的演示:
  
(点击图片预览效果)。完整的源代码在附件——图三源代码。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

3795

主题

2

听众

5万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
53202
精华
32

活跃会员 优秀版主 推广达人 突出贡献 荣誉管理 论坛元老

沙发
发表于 2013-1-6 16:27:42 |只看该作者
【Away3D初级教程】总目录
  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-4-19 18:18 , Processed in 0.104486 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部