Experiment #02: Earth Fire

演示 | 下载 | 用到的pv3d类库

主要演示了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, 0x222222);
	frame.graphics.drawCircle(0, 0, 250);
	viewport.containerSprite.addChild(frame);
 
	addEventListener(Event.ENTER_FRAME, tick);
}

其他使用BitmapEffect的参考: Sound Visualizer with Papervision3D

Bookmark and Share

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

Comments :