- 浏览: 379237 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (121)
- flex及Flash3D表现研究 (6)
- papervision3D研究 (26)
- flashParticle粒子系统 (9)
- Papervision3d动力学研究 (6)
- flex知识 (14)
- as3程序基础 (11)
- flex组件样式演示 (3)
- flex与PHP、mySQL学习 (0)
- flex声音表现研究 (0)
- flex整站开发研究 (0)
- flex开发市场 (0)
- flash cs3教程 (1)
- flex与flash文件的交互 (2)
- flex、flash资源集 (1)
- flash cs4研究 (1)
- flash游戏编程 (0)
- DirectX游戏编程 (3)
- silverlight研究 (4)
- Java学习 (2)
- 数学知识 (1)
- VC++ (3)
- 行业信息 (2)
- away3d (6)
- alternativa3d (1)
- Pixel Bender 研究 (0)
- 随笔 (1)
- Google O3D (1)
- Javascript (1)
- iphone 3d游戏开发 (6)
- Html 5 3d (3)
- Unity3d手机游戏开发 (5)
最新评论
-
3580737:
在哪里看看
AS3的深度管理及排序 -
yangyang111310:
我靠 哥们 行不行啊
flex + tomcat + myEclipse环境配置与使用(三) -
jjjkkk:
nice 感谢 flash player的版本真DT
Flash Player10 Debug版--正式版 -
lattimore:
Excellent
从3dsmax导出Dae模型到papervision3D -
ytdalin21:
合作很愉快,技术都挺靠谱!下次继续合作!
papervision dae animation(DAE角色动画控制)
这个是Flint Particle粒子入门教程,as3 flash Particle下雪效果,下面是效果
【http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
Flint Particle粒子在线帮助文档:
http://flintparticles.org/docs/
由于开发的需要,我们的很多实例都是建立在Flex平台的
首先我们需要建立一个Flex的画布
具体请参考我们的博客文章:Flex画布的建立。
我们这里的画布其实是我们自己写的一个Flex的组件,我们把它发到myCanvas3D的包里,它的代码如下:
Canvas3D.as
我们通过这个方法在Flex里建立这个组件。
这样就生成了一个黑色的Canvas3D画布,他的尺寸为500X400的。
那样我们的Sprite物体就可以加到它上面了。
首先我们要做的第一步是把Flint Particle的类包复制到我们的项目文件包里。如图
下面我们是通过类的形式来实现下雪的效果,首先我们建立一个Snowfall粒子发射器,它继承自Emitter2D发射器。代码如下:
下面我们分析一下这个Snowfall粒子发射器的性质。
第一步,引入需要应用到的类:
以后我们再说明这些类的意义。
Snowfall类继承自Emitter2D类。
下一句:
Steady,这里是用了一个稳定类型的counter。(counter是接口,Steady是实现接口的一个类)。这里需要注意的Flint粒子系统给我们提供了许多中类型的counter,当然它们都实现了counter接口的所有方法。
counter(数量)是Emitter(也就是Snowfall对象)的一个属性。
Steady类是继承了counter接口的类,它能直接实例化为counter对象。
我们这里是:接口 接口 = new 实例化类(); 这样可以该接口所实例化类的对象。
我们进入counter属性的定义(在Emitter类里)
我们会注意到counter是一个Set get存取器,通过这个counter方法我们可以存取或获得一个counter类型的对象。
关于接口和实例化的类,大家可以深入去学习一下。
counter接口的代码如下:
它给我们提供了4个需要实现的接口方法,它们分别是:
startEmitter(开始发射):发射器开始发射的时候就调用startEmitter方法,它自动就会执行,不需要我们手动去调用。emitter发射器是它的参数,它返回已经发射的粒子数;
updateEmitter(更新):updateEmitter方法在粒子发射器发射后的每帧执行的时候都会被调用。该方法自动执行,参数为emitter粒子发射器和time时间,返回到当时的粒子发射数量;
stop(停止发射):停止发射粒子;
resume(重启):重新开始发送粒子。
下面我们需要设置粒子的各种属性:
position(位置), velocity(速度), image(显示图像) 和 color(颜色)
我们通过给粒子增加initializer(初始化属性)来设定粒子的这些属性。
因为这里我们是用了一个DisplayObjectEmitter(显示物体类型发射器),所以发射器会为每个粒子生成一个DisplayObject(显示物体)。
关于粒子的Initializer(初始化器):
第一步,我们需要告诉粒子是它应该是什么样的。我们用一个ImageClass initializer(图像类型初始化器)来告诉Emitter如何去实现发射的粒子物体类型。
我们来看看Initializer(初始化物体),Flint粒子定义了一个Initializer接口。
在Flex里我们需要把图像embed(植入)到工作区里,然后以类的方式应用。方法如下:
然而这里我们用Flint Particle粒子图像库里自带的RadialDot class(辐射点图类)来作为ImageClass的资源。RadialDot class是一个简单的圆点渐变图。RadialDot继承自Shape。我们可以参阅它的构造函数。
最后把ImageClass initializer加到emitter。
省去一些步骤,结果如下:
关于区域(Zone):
下面我们来讨论一下粒子的区域(Zone),位置初始化器(Position initializer)用到区域(Zone)。Zone是一个粒子定义的区域。这个其实是粒子的发射形状区域。这里我们选择了线性发射形状(LineZone),发射区域的代码如下:
我们给粒子发射器(emitter)增加一个速度初始化器(Velocity initializer),让粒子能动起来。代码:
关于粒子行为(Actions)
这时候我们还是没有看到粒子的执行,我们还需要给粒子发射器增加一些行为(Actions)。为了开始作用,我们只需要给粒子增加一个行为(Actions),虽然这里我们的粒子有了位置和速度,但是还需要运动行为(Move action)来实时的更新粒子的位置和速度信息。
上面的设置都完成后就可以开始发射粒子了,代码:
这个过程对于初学者有一定的难度,但是耐心消化一下,问题还是能解决的,祝您成功!顺祝大家新年快乐!
运行项目后我们会看到长长的粒子落了下来,我们需要设置粒子的结束和寿命值。
我们用一个销毁区域(DeathZone)来销毁多余的,不在该区域里的粒子。代码:
缩简一下:
我们可以通过改变这两个点所包括的区域,不在这两个点的区域里的其他粒子都不显示了。
粒子的随机性(让粒子更自然):
我们给粒子增加一个缩放初始器(ScaleImageInit initializer)来让粒子产生随机大小。
ScaleImageInit方法带两个参数(最小缩放值,最大缩放值)
总结一下:addInitializer(初始化器),它的参数必须是初始化器。
增加随机运动:
先运行(runAhead):
为了让影片运行的时候粒子就布满了画布,我们需要给粒子一个先发射时间,代码:
根据以上分析,我们得出雪花粒子的类Snowfall.as
Flex mxml代码:
恩,基本上就到这里了!更多的知识需要我们进一步深入研究,努力啊!
【http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
【http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
Flint Particle粒子在线帮助文档:
http://flintparticles.org/docs/
由于开发的需要,我们的很多实例都是建立在Flex平台的
首先我们需要建立一个Flex的画布
具体请参考我们的博客文章:Flex画布的建立。
我们这里的画布其实是我们自己写的一个Flex的组件,我们把它发到myCanvas3D的包里,它的代码如下:
Canvas3D.as
package myCanvas3D { import flash.display.Graphics; import flash.display.Sprite; import flash.geom.Rectangle; import mx.core.UIComponent; import mx.effects.easing.Back; public class Canvas3D extends UIComponent { private var paperSprite:Sprite; private var backgroundSprite:Sprite; private var clipRect:Rectangle; private var _backgroundColor:uint = 0x000000; private var _backgroundAlpha:Number = 1; public function Canvas3D() { super(); init(); } private function init():void { clipRect = new Rectangle(); } override protected function createChildren():void { super.createChildren(); backgroundSprite = new Sprite(); backgroundSprite.cacheAsBitmap = true; paperSprite = new Sprite(); addChild(backgroundSprite); addChild(paperSprite); } override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth,unscaledHeight); drawBackground(); var hw:Number = 0; var hh:Number = 0; paperSprite.x = hw; paperSprite.y = hh; clipRect.x = 0; clipRect.y = 0; clipRect.width = unscaledWidth; clipRect.height = unscaledHeight; scrollRect = clipRect; } protected function drawBackground():void { if(backgroundSprite){ var g:Graphics = backgroundSprite.graphics; g.clear(); g.beginFill(backgroundColor, _backgroundAlpha); g.drawRect(0,0,unscaledWidth,unscaledHeight); g.endFill(); } } public function set backgroundColor(bgColor:uint):void { _backgroundColor = bgColor; drawBackground(); } public function get backgroundColor():uint { return _backgroundColor; } public function set backgroundAlpha(alpha:Number):void { _backgroundAlpha = alpha; } public function get backgroundAlpha():Number { return _backgroundAlpha; } public function get canvas():Sprite { return paperSprite; } } }
我们通过这个方法在Flex里建立这个组件。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:myCanvas3D="*" layout="absolute" xmlns:myCanvas3D1="myCanvas3D.*"> <myCanvas3D1:Canvas3D width="500" height="400" id="mycanvas3d" backgroundColor="0x000000"/>
这样就生成了一个黑色的Canvas3D画布,他的尺寸为500X400的。
那样我们的Sprite物体就可以加到它上面了。
首先我们要做的第一步是把Flint Particle的类包复制到我们的项目文件包里。如图
下面我们是通过类的形式来实现下雪的效果,首先我们建立一个Snowfall粒子发射器,它继承自Emitter2D发射器。代码如下:
package { import flash.geom.Point; import org.flintparticles.common.counters.*; import org.flintparticles.common.displayObjects.RadialDot; import org.flintparticles.common.initializers.*; import org.flintparticles.twoD.actions.*; import org.flintparticles.twoD.emitters.Emitter2D; import org.flintparticles.twoD.initializers.*; import org.flintparticles.twoD.zones.*; public class Snowfall extends Emitter2D { public function Snowfall() { counter = new Steady( 100 );//每秒发发射的粒子数为100 addInitializer( new ImageClass( RadialDot, 2 ) ); addInitializer( new Position( new LineZone( new Point( -5, -5 ), new Point( 505, -5 ) ) ) ); addInitializer( new Velocity( new PointZone( new Point( 0, 65 ) ) ) ); addInitializer( new ScaleImageInit( 0.75, 2 ) ); addAction( new Move() ); addAction( new DeathZone( new RectangleZone( -10, -10, 520, 420 ), true ) ); addAction( new RandomDrift( 15, 15 ) ); } } }
下面我们分析一下这个Snowfall粒子发射器的性质。
第一步,引入需要应用到的类:
import flash.geom.Point; import org.flintparticles.common.counters.*; import org.flintparticles.common.displayObjects.RadialDot; import org.flintparticles.common.initializers.*; import org.flintparticles.twoD.actions.*; import org.flintparticles.twoD.emitters.Emitter2D; import org.flintparticles.twoD.initializers.*; import org.flintparticles.twoD.zones.*;
以后我们再说明这些类的意义。
public class Snowfall extends Emitter2D
Snowfall类继承自Emitter2D类。
下一句:
counter = new Steady( 100 );
Steady,这里是用了一个稳定类型的counter。(counter是接口,Steady是实现接口的一个类)。这里需要注意的Flint粒子系统给我们提供了许多中类型的counter,当然它们都实现了counter接口的所有方法。
counter(数量)是Emitter(也就是Snowfall对象)的一个属性。
Steady类是继承了counter接口的类,它能直接实例化为counter对象。
我们这里是:接口 接口 = new 实例化类(); 这样可以该接口所实例化类的对象。
我们进入counter属性的定义(在Emitter类里)
public function get counter():Counter { return _counter; } public function set counter( value:Counter ):void { _counter = value; }
我们会注意到counter是一个Set get存取器,通过这个counter方法我们可以存取或获得一个counter类型的对象。
关于接口和实例化的类,大家可以深入去学习一下。
counter接口的代码如下:
package org.flintparticles.common.counters { import org.flintparticles.common.emitters.Emitter; /** * The Counter interface must be implemented by all counters. * * <p>A counter is a class that tells an emitter how many particles to * emit at any time. The two methods control the rate of emission of particles * when the emitter starts and every frame thereafter.</p> * * <p>A counter is directly associated with an emitter. A counter is set for * an emitter by assigning it to the emitter's counter property.</p> * * @see org.flintparticles.common.emitters.Emitter#counter */ public interface Counter { /** * The startEmitter method is called when the emitter starts. * * <p>This method is called within the emitter's start method * and need not be called by the user.</p> * * @param emitter The emitter. * @return The number of particles the emitter should emit when it starts. */ function startEmitter( emitter:Emitter ):uint; /** * The updateEmitter method is called every frame after the * emitter has started. * * <p>This method is called within the emitter's update loop and need not * be called by the user.</p> * * @param emitter The emitter * @param time The time, in seconds, since the previous call to this method. * @return The number of particles the emitter should emit * at this time. */ function updateEmitter( emitter:Emitter, time:Number ):uint; /** * Stops the emitter from emitting particles */ function stop():void; /** * Resumes the emitter after a stop */ function resume():void; } }
它给我们提供了4个需要实现的接口方法,它们分别是:
startEmitter(开始发射):发射器开始发射的时候就调用startEmitter方法,它自动就会执行,不需要我们手动去调用。emitter发射器是它的参数,它返回已经发射的粒子数;
updateEmitter(更新):updateEmitter方法在粒子发射器发射后的每帧执行的时候都会被调用。该方法自动执行,参数为emitter粒子发射器和time时间,返回到当时的粒子发射数量;
stop(停止发射):停止发射粒子;
resume(重启):重新开始发送粒子。
下面我们需要设置粒子的各种属性:
position(位置), velocity(速度), image(显示图像) 和 color(颜色)
我们通过给粒子增加initializer(初始化属性)来设定粒子的这些属性。
因为这里我们是用了一个DisplayObjectEmitter(显示物体类型发射器),所以发射器会为每个粒子生成一个DisplayObject(显示物体)。
关于粒子的Initializer(初始化器):
第一步,我们需要告诉粒子是它应该是什么样的。我们用一个ImageClass initializer(图像类型初始化器)来告诉Emitter如何去实现发射的粒子物体类型。
我们来看看Initializer(初始化物体),Flint粒子定义了一个Initializer接口。
在Flex里我们需要把图像embed(植入)到工作区里,然后以类的方式应用。方法如下:
var imgClass:ImageClass = new ImageClass( MyImageClass );
然而这里我们用Flint Particle粒子图像库里自带的RadialDot class(辐射点图类)来作为ImageClass的资源。RadialDot class是一个简单的圆点渐变图。RadialDot继承自Shape。我们可以参阅它的构造函数。
var imgClass:ImageClass = new ImageClass( RadialDot, 2 );
最后把ImageClass initializer加到emitter。
emitter.addInitializer( imgClass );
省去一些步骤,结果如下:
emitter.addInitializer( new ImageClass( RadialDot, 2 ) );
关于区域(Zone):
下面我们来讨论一下粒子的区域(Zone),位置初始化器(Position initializer)用到区域(Zone)。Zone是一个粒子定义的区域。这个其实是粒子的发射形状区域。这里我们选择了线性发射形状(LineZone),发射区域的代码如下:
emitter.addInitializer( new Position( new LineZone( new Point( -5, -5 ), new Point( 505, -5 ) ) ) );
我们给粒子发射器(emitter)增加一个速度初始化器(Velocity initializer),让粒子能动起来。代码:
emitter.addInitializer( new Velocity( new PointZone( new Point( 0, 65 ) ) ) );
关于粒子行为(Actions)
这时候我们还是没有看到粒子的执行,我们还需要给粒子发射器增加一些行为(Actions)。为了开始作用,我们只需要给粒子增加一个行为(Actions),虽然这里我们的粒子有了位置和速度,但是还需要运动行为(Move action)来实时的更新粒子的位置和速度信息。
emitter.addAction( new Move() );
上面的设置都完成后就可以开始发射粒子了,代码:
emitter.start();
这个过程对于初学者有一定的难度,但是耐心消化一下,问题还是能解决的,祝您成功!顺祝大家新年快乐!
运行项目后我们会看到长长的粒子落了下来,我们需要设置粒子的结束和寿命值。
我们用一个销毁区域(DeathZone)来销毁多余的,不在该区域里的粒子。代码:
var dzone:RectangleZone = new RectangleZone( -10, -10, 520, 420 ); var deathZone:DeathZone = new DeathZone( dzone, true ); emitter.addAction( deathZone );
缩简一下:
emitter.addAction( new DeathZone( new RectangleZone( -10, -10, 520, 420 ), true ) );
我们可以通过改变这两个点所包括的区域,不在这两个点的区域里的其他粒子都不显示了。
粒子的随机性(让粒子更自然):
我们给粒子增加一个缩放初始器(ScaleImageInit initializer)来让粒子产生随机大小。
emitter.addInitializer( new ScaleImageInit( 0.75, 2 ) );
ScaleImageInit方法带两个参数(最小缩放值,最大缩放值)
总结一下:addInitializer(初始化器),它的参数必须是初始化器。
增加随机运动:
emitter.addAction( new RandomDrift( 15, 15 ) );
先运行(runAhead):
为了让影片运行的时候粒子就布满了画布,我们需要给粒子一个先发射时间,代码:
emitter.runAhead( 10 );
根据以上分析,我们得出雪花粒子的类Snowfall.as
Flex mxml代码:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:myCanvas3D="*" layout="absolute" xmlns:myCanvas3D1="myCanvas3D.*" applicationComplete="init()"> <mx:Script> <![CDATA[ import flash.geom.Point; import org.flintparticles.twoD.renderers.*; var emitter:Snowfall; var renderer:DisplayObjectRenderer; public function init(){ renderer = new DisplayObjectRenderer(); emitter= new Snowfall(); renderer.addEmitter( emitter ); mycanvas3d.canvas.addChild( renderer );//注意这里把render物体加入到mycanvas3d.canvas emitter.start(); emitter.runAhead( 10 ); } ]]> </mx:Script> <myCanvas3D1:Canvas3D width="500" height="400" id="mycanvas3d" backgroundColor="0x000000"/> </mx:Application>
恩,基本上就到这里了!更多的知识需要我们进一步深入研究,努力啊!
【http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
发表评论
-
Flint Particle粒子入门教程(五):关于Initializer
2009-02-21 18:53 1997在Flint Particle粒子中,Initializer是 ... -
Flint Particle粒子入门教程(四):接口和类的实现结构
2009-02-21 14:17 1940下面我们看看Flint Particl ... -
关于FlintParticle的Initializer(初始化)类
2009-01-17 21:37 1146Initializer是FlintParticle的基础接口, ... -
Flint Particle粒子入门教程(三):三维粒子实例之烟花效果
2009-01-11 00:13 2875【http://www.newflash3d.com--- ... -
Flint Particle粒子入门教程(二):三维粒子实例
2009-01-10 22:13 1999我们来研究一下Flint Particle粒子的三维粒子演示, ... -
Flint Particle粒子入门教程(一)
2009-01-10 12:59 3124【http://www.newflash3d.com---fl ... -
Flint Particle粒子入门教程-基本结构思路
2009-01-09 12:59 1658这里我们讨论一下Flint Particle粒子应用的基本结构 ... -
flashparticle粒子实例(一)
2009-01-06 01:28 1719【http://www.newflash3d.com---fl ...
相关推荐
《飞翔的乌鸦》——基于Flint粒子系统的Flash 3D技术详解 在数字艺术与游戏开发领域,粒子系统已经成为创建动态效果、如火焰、烟雾、水波、星光等不可或缺的工具。其中,Flint粒子系统是一款强大的开源粒子编辑器,...
《BornGrass-flint粒子系统:打造极致真实的Flash 3D草丛效果》 在数字艺术与游戏开发领域,粒子系统是一种重要的技术手段,用于创建动态的、视觉上吸引人的效果,如火焰、烟雾、水流、草动等。本文将深入探讨...
- **基础示例**:通过几个简单的示例演示了如何使用FLINT进行基本操作。 - **高级应用**:展示了FLINT在解决复杂数学问题方面的应用案例。 - **代码解析**:详细解释了示例代码的工作原理和实现细节。 #### 十五、...
4. **丰富的内置效果**:库中包含了多种预设的粒子效果,如基本的粒子发射器、喷射器、漩涡等,开发者可以直接使用,也可以作为自定义效果的基础。 5. **易用性**:Flint的API设计直观且易于理解,使得开发者可以...
FLINT(FLEXIBLE INTERCEPTOR A REALISTIC MISSILE SIMULATION SOFTWARE)是一款针对商品游戏(commodity games)的现实主义导弹模拟软件。它能在不需要复杂引擎支持的情况下,为游戏提供相当真实的导弹和火箭弹道的...
在某个峰会上,他深入探讨了Flint的相关知识,特别是其架构和安装流程。Flint项目的目标是将大数据分析服务(Big Data Analytics Service,简称BDAS)带入亚马逊网络服务(Amazon Web Services,简称AWS)的大众市场...
flint8.5 on linux特效合成系统.pdf
**Flint前端入门套件** 是一款专为初学者...通过深入理解和熟练运用Flint前端入门套件,你可以快速掌握前端开发的基础,并且享受到CSS预处理器带来的便利。同时,参与开源社区的互动也是提升技能和积累经验的好方法。
标题中的“flint”可能是指该库的项目名,它可能来源于英文单词“flint”,意为燧石,象征着点燃知识的火花。这个库很可能提供了核心的加密和解密功能,包括但不限于对称加密、非对称加密、哈希函数和消息认证码等。...
强大的数论库
3. **预设组件**:`flint-babylon`可能包含了预设的3D对象和组件,如相机、粒子系统、UI元素等,方便开发者快速搭建3D场景。 4. **性能优化**:通过针对前端应用场景的优化,`flint-babylon`可能提高了Babylon.js在...
flint视觉效果系统是专为电影、电视和其他多媒体内容制作设计的工具,可能包含高级的图像处理、合成、粒子系统、动态模拟等功能,旨在帮助艺术家们创造逼真的特效和动画。这类系统通常需要强大的计算能力和高效的...
"基于Flint的师生互动实证研究论文" 本文是基于Flint的师生互动实证研究论文,主要探讨基于Flint的师生互动实证研究。Flint是 Foreign Language Interaction System 的缩写,是一种互动分析系统,用于分析课堂师生...
int石编程语言 Flint是一种新型的类型安全,面向合同的编程语言,专门用于在以太坊上编写健壮的智能合同。 Flint仍处于alpha开发阶段,尚未准备好用于生产中。 中型文章: 和编程2018! 论文:当前工作文件: 在苏珊...
为Apple平台构建出色的应用程序涉及大量工作; 自定义网址方案,应用内购买,授权系统权限,通用链接,切换和Siri支持,跟踪分析事件,功能标记等。 这些东西可能是繁琐而耗时的,但你不应该动手做这一切!
Flint4.1 chm made by mengtianwxs
Flint是一个框架,可使用Swift的功能根据功能和操作为Apple平台构建应用程序。 应用的功能是根据运行时限制启用的; 系统权限,操作系统版本或应用内购买。 它需要您的操作,并提供增强的日志记录,自动分析事件,...
《Python库flint_py-0.3.2-cp36-cp36m-manylinux1_x86_64.whl详解》 在Python的世界里,库是开发者的重要工具,它们提供了丰富的功能,帮助程序员高效地完成各种任务。本文将深入探讨名为`flint_py`的Python库,其...
燧石Flint是Fortran的皮棉工具。 它尚不起作用,但是当前可以执行一些基本任务。 目前,它是作为Python模块编写的,但是我希望有一天它将使用命令行工具。 Flint目前尚无法完全使用,但它确实包含一些不错的功能,...