package { import flash.display.Sprite; import flash.events.Event; import flash.filters.DropShadowFilter; import org.papervision3d.lights.PointLight3D; import org.papervision3d.materials.shadematerials.FlatShadeMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.materials.BitmapFileMaterial; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.BasicView; public class AnalogClockDemo extends Sprite { private var v:BasicView = new BasicView(600, 600, false); private var clockMaterial:BitmapFileMaterial; private var clock:Plane; private var hPointer:DisplayObject3D = new DisplayObject3D(); private var mPointer:DisplayObject3D = new DisplayObject3D(); private var sPointer:DisplayObject3D = new DisplayObject3D(); private var hp:Cube; private var mp:Cube; private var sp:Cube; private var light:PointLight3D; private var blackShade:FlatShadeMaterial; private var redShade:FlatShadeMaterial; private var blackList:MaterialsList; private var redList:MaterialsList; private var time:Date; private var drop:DropShadowFilter = new DropShadowFilter(5, 90, 0, .25, 20, 20); public function AnalogClockDemo() { initPV3D(); initClock(); initPointers(); addEventListener(Event.ENTER_FRAME, render3D); } private function initPV3D():void { addChild(v.viewport); v.camera.zoom = 120; } private function initClock():void { clockMaterial = new BitmapFileMaterial("clock.png", true); clockMaterial.smooth = true; clock = new Plane(clockMaterial, 500, 500, 10, 10); v.scene.addChild(clock); } private function initPointers():void { light = new PointLight3D(); redShade = new FlatShadeMaterial(light, 0xFF0000); blackShade = new FlatShadeMaterial(light, 0x808080); redList = new MaterialsList(); blackList = new MaterialsList(); redList.addMaterial(redShade, "all"); blackList.addMaterial(blackShade, "all"); hp = new Cube(blackList, 20, 5, 150, 2, 2, 2); hPointer.addChild(hp); mp = new Cube(blackList, 10, 5, 200, 2, 2, 2); mPointer.addChild(mp); sp = new Cube(redList, 3, 5, 200, 2, 2, 2); sPointer.addChild(sp); hp.y += 65; mp.y += 90; sp.y += 90; hp.z -= 30; mp.z -= 35; sp.z -= 40; hPointer.useOwnContainer = mPointer.useOwnContainer = sPointer.useOwnContainer = true; hPointer.filters = mPointer.filters = sPointer.filters = [drop]; v.scene.addChild(hPointer); v.scene.addChild(mPointer); v.scene.addChild(sPointer); } private function getTime():void { time = new Date(); hours = time.getHours(); mins = time.getMinutes(); secs = time.getSeconds(); if (hours > 12) hours -= 12; var secondAngle:Number = 360 * secs / 60; var minuteAngle:Number = 360 * mins / 60; var hourAngle:Number = 360 * hours/12 + minuteAngle/12; sPointer.rotationZ = -secondAngle; mPointer.rotationZ = -minuteAngle; hPointer.rotationZ = -hourAngle; } public function render3D(e:Event):void { getTime(); v.singleRender(); v.camera.x = (stage.mouseX - 300) * 2; v.camera.y = -(stage.mouseY - 300) * 2; } } }