/* * * @author selflash * @version 1.0.0 * @date 2010/03/06 * @see http://selflash.jp/ * * DisplayObject3Dでマスクのかけ方の練習 * 注意:3つも表示させて処理が重いのかPCがすぐ高温になります! * * Because the personal computer becomes high temperature, please note * * 追記:なんか高温になるの僕のPCだけかも、、、 */ package { import flash.display.*; import flash.events.*; import flash.utils.*; import flash.filters.*; import org.papervision3d.view.BasicView; import org.papervision3d.view.layer.*; import org.papervision3d.materials.*; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.materials.special.CompositeMaterial; import org.papervision3d.objects.*; import org.papervision3d.objects.primitives.*; [SWF(width = "440", height = "440", frameRate = "60", backgroundColor = "#FFFFFF")] public class FlashTest extends BasicView { private var cube1:Cube; private var cube2:Cube; private var cube3:Cube; private var maskObj:Sphere; private const WIRE_MAT:WireframeMaterial = new WireframeMaterial( 0x000000 ); private const COLOR_MAT:ColorMaterial = new ColorMaterial(0xFFFFFF * Math.random(), 1); private const FACE_NAME:Array = ["front", "back", "top", "bottom", "right", "left"]; public function FlashTest():void { scene.addChild(createFloor()); cube1 = createCube(true); cube1.x = -100; scene.addChild(cube1); maskObj = new Sphere(COLOR_MAT, 80, 16, 16); maskObj.x = -110; maskObj.y = 30; scene.addChild(maskObj); var layer1:ViewportLayer = viewport.getChildLayer(cube1); var maskLayer1:ViewportLayer = viewport.getChildLayer(maskObj); layer1.mask = maskLayer1; layer1.filters = [new GlowFilter( 0x000000, 1, 16, 16, 6 )]; cube2 = createCube(true); cube2.x = 100; scene.addChild(cube2); maskObj = new Sphere(COLOR_MAT, 80, 16, 16); maskObj.x = 110; maskObj.y = 30; scene.addChild(maskObj); var layer2:ViewportLayer = viewport.getChildLayer(cube2); var maskLayer2:ViewportLayer = viewport.getChildLayer(maskObj); layer2.mask = maskLayer2; layer2.filters = [new GlowFilter( 0xFF3322, 1, 18, 18 )]; layer2.blendMode = BlendMode.INVERT; //viewport.containerSprite.blendMode = BlendMode.INVERT; cube3 = createCube(false); cube3.y = 200; scene.addChild(cube3); maskObj = new Sphere(COLOR_MAT, 80, 16, 16); maskObj.x = 10; maskObj.y = 230; scene.addChild(maskObj); var layer3:ViewportLayer = viewport.getChildLayer(cube3); var maskLayer3:ViewportLayer = viewport.getChildLayer(maskObj); layer3.mask = maskLayer3; layer3.filters = [new GlowFilter( 0xFF3322, 1, 18, 18 )]; layer3.blendMode = BlendMode.INVERT; startRendering(); } private function createFloor():Plane { var plane:Plane = new Plane(WIRE_MAT, 600, 600, 10, 10); plane.rotationX = 90; plane.rotationY = 20; plane.y = -100; return plane; } private function createCube(color:Boolean):Cube { var matList:MaterialsList = new MaterialsList(); for (var i:int = 0; i < FACE_NAME.length; i++ ) { var material:CompositeMaterial = new CompositeMaterial(); material.addMaterial( WIRE_MAT ); if(color)material.addMaterial( COLOR_MAT ); matList.addMaterial(material, FACE_NAME[i]); } return new Cube(matList, 120, 120, 120, 1, 1, 1); } override protected function onRenderTick(e:Event = null):void { super.onRenderTick(); cube1.rotationX = cube3.rotationX += Math.sin(getTimer() / 1000); cube2.rotationX = cube1.rotationY += Math.sin(getTimer() / 2000); cube3.rotationY = cube2.rotationY += Math.sin(getTimer() / 3000); //maskObj.rotationX = -mouseY; //maskObj.rotationY = -mouseX; camera.x = 500 * Math.sin(getTimer() / 3400); camera.y = 100 * Math.sin(getTimer() / 2000) + 100; camera.z = 200 * Math.cos(getTimer() / 2000); } } } PV3DのDO3DでMaskをかけるTest【In sphere mask】