http://kevincao.com/2008/11/05/experiment02-earth-fire/
主要演示了pv3d新版本的渲染層機制的一些知識點,和BitmapEffectLayer。以下是主要代碼:
public function init3D() : void {
camera.fov = 55;
//設(shè)置一個空物體作為兩個球體的父對象
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);
//環(huán)境貼圖需要一個光源
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)的層次結(jié)構(gòu)和渲染對應(yīng)的結(jié)構(gòu)是分開的,接下來設(shè)置渲染的層次結(jié)構(gòu)
//默認情況下do3d渲染到viewport.containerSprite中
//containerSprite是一個ViewportBaseLayer對象,繼承自ViewportLayer,也是一個Sprite
//BitmapEffectLayer原先是Effect分支里的功能,現(xiàn)在整合到Great White里面來了
//把do3d渲染到BitmapEffectLayer可以添加一些Bitmap濾鏡效果
var bfx : BitmapEffectLayer = new BitmapEffectLayer(viewport, 500, 500);
//ViewportLayer對象必須用addLayer語句添加到containerSprite
viewport.containerSprite.addLayer(bfx);
//把球體加進bfx層,記住do3d的層次結(jié)構(gòu)和渲染對應(yīng)的圖層結(jié)構(gòu)是分開的
//所以我們不能直接把dummy加進bfx層,這樣dummy的子對象是不被一同加入的
bfx.addDisplayObject3D(s1);
bfx.addDisplayObject3D(s2);
//火焰效果很簡單,添加一個效果對象就可以了
bfx.addEffect(new BitmapFireEffect(1, 1, 1, 1));
//effects數(shù)組可以索引屬于圖層的效果對象
bfx.effects[0].flameHeight = 1;
//設(shè)置bitmap每幀的移動量
bfx.setScroll(4, 3);
//出于CPU占用考慮,一般不會用很大的位圖來生成效果。一種可用的做法是只把效果渲染到一塊較小的區(qū)域內(nèi)
//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);
//現(xiàn)在在containerSprite下面有兩個圖層,我們可以設(shè)置遮罩
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);
}
相關(guān)文章