package demo.papervision3d { import org.papervision3d.core.render.data.RenderHitData; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.BasicView; import flash.events.Event; /** * @author Kevin Cao */ public class HitTestDemo extends BasicView { private var items : Array; private var group : DisplayObject3D; private var radius : Number = 500; private var count : Number = 12; private var offset : Number = 0; private var speed : Number = 0; private var planeWidth : Number = 500; private var planeHeight : Number = 200; private var ease : Number = 0.25; [SWF(width="1000", height="600", backgroundColor="0xffffff", frameRate="30")] public function HitTestDemo() { items = []; buildPlane(); viewport.interactive = true; startRendering(); } private function buildPlane() : void { var plane : Plane; group = new DisplayObject3D(); scene.addChild(group); for(var i : int = 0;i < count; i++) { plane = new Plane(new ColorMaterial(Math.random() * 0xffffff), planeWidth, planeHeight); plane.material.interactive = true; plane.x = getX(i); plane.y = getY(i); plane.z = getZ(i); group.addChild(plane); viewport.getChildLayer(plane); items[i] = plane; } } override protected function onRenderTick(event : Event = null) : void { super.onRenderTick(event); speed += (viewport.containerSprite.mouseY * -0.00005 - speed) * ease; rotate(); group.rotationY += (viewport.containerSprite.mouseX * -0.01 - group.rotationY) * ease; } private function rotate() : void { var plane : Plane; var rhd : RenderHitData = viewport.hitTestMouse(); offset += speed; for(var i : int = 0;i < count; i++) { plane = items[i]; var x : Number = getX(i); var y : Number = getY(i); var z : Number = getZ(i); if(rhd.hasHit && rhd.displayObject3D == plane) { if(Math.abs(rhd.x - x) < planeWidth / 2 + 100) { x = rhd.x; } } plane.x += (x - plane.x) * ease; plane.y += (y - plane.y) * ease; plane.z += (z - plane.z) * ease; viewport.getChildLayer(plane).alpha = map(plane.z, -radius, radius + 100, 1, 0); } } private function getX(i : int) : Number { return -Math.cos(2 * Math.PI / count * i + offset) * (radius + 100) - planeWidth / 2; } private function getY(i : int) : Number { return Math.sin(2 * Math.PI / count * i + offset) * (radius + 100); } private function getZ(i : int) : Number { return Math.cos(2 * Math.PI / count * i + offset) * radius; } private function map(value : Number, min1 : Number, max1 : Number, min2 : Number, max2 : Number) : Number { return min2 + (max2 - min2) * (value - min1) / (max1 - min1); } } }