Sealyu

--- 博客已迁移至: http://www.sealyu.com/blog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  618 随笔 :: 87 文章 :: 225 评论 :: 0 Trackbacks

http://kevincao.com/2008/11/05/experiment02-earth-fire/
主要演示了pv3d新版本的渲染层机制的一些知识点,和BitmapEffectLayer。以下是主要代码:

public function init3D() : void {
camera.fov = 55;

//设置一个空物体作为两个球体的父对象
dummy = new DisplayObject3D();

//添加灯
light = new PointLight3D();
scene.addChild(light);

//添加一个噪波作为贴图
var bitmap : BitmapData = new BitmapData(256, 256, false, 0);
bitmap.perlinNoise(64, 64, 2, Math.random() * 3000, false, false, 7, true);

//环境贴图需要一个光源
var mat : EnvMapMaterial = new EnvMapMaterial(light, bitmap);

var s1 : Sphere = new Sphere(mat, 80, 8, 8);
s1.x = 300;
s1.z = -100;

//使用地球图片做纹理贴图
var s2 : Sphere = new Sphere(new BitmapMaterial(image.bitmapData), 120, 12, 12);
s2.x = -400;
s2.z = 100;

//把球体添加到空物体中
dummy.addChild(s1);
dummy.addChild(s2);

scene.addChild(dummy);

//DisplayObject3D(简称do3d)的层次结构和渲染对应的结构是分开的,接下来设置渲染的层次结构
//默认情况下do3d渲染到viewport.containerSprite中
//containerSprite是一个ViewportBaseLayer对象,继承自ViewportLayer,也是一个Sprite

//BitmapEffectLayer原先是Effect分支里的功能,现在整合到Great White里面来了
//把do3d渲染到BitmapEffectLayer可以添加一些Bitmap滤镜效果
var bfx : BitmapEffectLayer = new BitmapEffectLayer(viewport, 500, 500);
//ViewportLayer对象必须用addLayer语句添加到containerSprite
viewport.containerSprite.addLayer(bfx);

//把球体加进bfx层,记住do3d的层次结构和渲染对应的图层结构是分开的
//所以我们不能直接把dummy加进bfx层,这样dummy的子对象是不被一同加入的
bfx.addDisplayObject3D(s1);
bfx.addDisplayObject3D(s2);

//火焰效果很简单,添加一个效果对象就可以了
bfx.addEffect(new BitmapFireEffect(1, 1, 1, 1));

//effects数组可以索引属于图层的效果对象
bfx.effects[0].flameHeight = 1;

//设置bitmap每帧的移动量
bfx.setScroll(4, 3);

//出于CPU占用考虑,一般不会用很大的位图来生成效果。一种可用的做法是只把效果渲染到一块较小的区域内
//BitmapEffectLayer.setTracking(do3d)用于让图层跟随某个do3d在屏幕上的位置移动
//但先要允许do3d自动计算自身的屏幕坐标。例如:
//s1.autoCalcScreenCoords = true;
//bfx.setTracking(s1);

//添加遮罩层
var msk : Sprite = new Sprite();
msk.graphics.beginFill(0xFF0000);
msk.graphics.drawCircle(0, 0, 250);
msk.graphics.endFill();
//containerSprite既然继承自Sprite,那么自然可以用addChild来新增图层
viewport.containerSprite.addChild(msk);

//现在在containerSprite下面有两个图层,我们可以设置遮罩
bfx.mask = msk;

//添加外边框作为修饰
var frame : Sprite = new Sprite();
frame.graphics.lineStyle(10, 0×222222);
frame.graphics.drawCircle(0, 0, 250);
viewport.containerSprite.addChild(frame);

addEventListener(Event.ENTER_FRAME, tick);
}

相关文章

posted on 2008-12-06 23:39 seal 阅读(767) 评论(0)  编辑  收藏 所属分类: Flex+ActionScript

只有注册用户登录后才能发表评论。


网站导航: