在PV3D中普通的DisplayObject3D对象如基本几何体、TriangleMesh3D等通常可以直接以树形层次添加到scene中,而Pixel3D较为特殊,它需要添加到Pixels容器中,而Pixels容器需要以一个BitmapEffectLayer作为参数,标准的写法是:
var bfx:BitmapEffectLayer = new BitmapEffectLayer(viewport,800,600); bfx.clearBeforeRender = true; viewport.containerSprite.addLayer(bfx); var pixels:Pixels = new Pixels(bfx); var pixel3d:Pixel3D = new Pixel3D(); pixels.addPixel3D(pixel3d);
即首先需要定义一个BitmapEffectLayer,并将这个BitmapEffectLayer添加到viewport中。再定义Pixels容器,并以刚才建立的BitmapEffectLayer作为参数。最后是创建具体的Pixel3D,把创建好的Pixel3D添加到Pixels容器中,至此就结束了所有的步骤。当然重点是确定Pixel3D对象,Pixel3D的构造函数如下:
Pixel3D(color:uint, x:Number = 0, y:Number = 0, z:Number = 0)
需要为Pixel3D指定颜色以及x,y,z的位置。颜色一般指定为Math.random()*0xffffffff这样的随机数。创建Pixel3D所需要的BitmapEffectLayer、Pixels和Pixel3D分别位于:
org.papervision3d.core.effects.BitmapLayerEffect org.papervision3d.core.geom.Pixels org.papervision3d.core.geom.renderables.Pixel3D
所以需要预先导入。下面制作一个简单的示例用来演示这个过程,类文件名为Pixel3DTest.as,源代码如下:
package{
import flash.events.Event;
import flash.filters.GlowFilter;
import org.papervision3d.core.effects.BitmapLayerEffect;
import org.papervision3d.core.geom.Pixels;
import org.papervision3d.core.geom.renderables.Pixel3D;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.view.BasicView;
import org.papervision3d.view.layer.BitmapEffectLayer;
[SWF(width=”800″, height=”600″, frameRate=”60″)]
public class Pixel3DTest extends BasicView{
private var container:DisplayObject3D;
public function Pixel3DTest(){
container = new DisplayObject3D;
var bfx:BitmapEffectLayer = new BitmapEffectLayer(viewport,800,600);
bfx.clearBeforeRender = true;
viewport.containerSprite.addLayer(bfx);
var pixels:Pixels = new Pixels(bfx);
for(var i:int=0;i<6000;i++){
var color:uint = Math.random()*0xffffffff;
var px:Number = Math.random()*800-400;
var py:Number = Math.random()*600-300;
var pz:Number = Math.random()*100-50;
var pixel3d:Pixel3D = new Pixel3D(color,px,py,pz);
pixels.addPixel3D(pixel3d);
}
container.addChild(pixels);
bfx.addDisplayObject3D(container);
bfx.addEffect(new BitmapLayerEffect(new GlowFilter(color,1,8,8,5,7)));
scene.addChild(container);
startRendering();
}
protected override function onRenderTick(event:Event = null):void{
container.yaw(4);
super.onRenderTick(event);
}
}
}
[/code]
代码创建了BitmapEffectLayer,并将它添加到viewport中。创建Pixels容器,通过for循环创建6000个随即颜色和随机位置的Pixel3D,将它们都添加到Pixels容器中。最后将Pixels容器添加到一个DisplayObject3D类型的容器中。在onRenderTick函数中使container容器围绕Y轴旋转。