package { import flash.events.Event; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; import org.papervision3d.cameras.CameraType; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.materials.BitmapFileMaterial; import org.papervision3d.materials.BitmapMaterial; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.BasicView; import org.papervision3d.view.layer.ViewportLayer; [SWF( width='800', height='512', backgroundColor='0x000000', frameRate='30' )] public class VisionneuseCubeHotspots extends BasicView { private static const IMG_BASE_URL:String = "assets/rendu_cubique_"; private static var MAX_X_ROTATION:int = 50; private var cube:Cube; private var label:TextField; public function VisionneuseCubeHotspots() { super( 800, 512, true, true, CameraType.FREE ); createTextfield(); createCube(); createHotspots(); camera.z = 0; startRendering(); } private function createCube():void { var frontMat:BitmapMaterial = new BitmapFileMaterial( IMG_BASE_URL+"FR.jpg" ); var backMat:BitmapFileMaterial = new BitmapFileMaterial( IMG_BASE_URL+"BK.jpg" ); var leftMat:BitmapFileMaterial = new BitmapFileMaterial( IMG_BASE_URL+"LF.jpg" ); var rightMat:BitmapFileMaterial = new BitmapFileMaterial( IMG_BASE_URL+"RT.jpg" ); var upMat:BitmapFileMaterial = new BitmapFileMaterial( IMG_BASE_URL+"UP.jpg" ); var downMat:BitmapFileMaterial = new BitmapFileMaterial( IMG_BASE_URL+"DN.jpg" ); frontMat.doubleSided = true; backMat.doubleSided = true; leftMat.doubleSided = true; rightMat.doubleSided = true; upMat.doubleSided = true; downMat.doubleSided = true; var imgMaterialList:MaterialsList = new MaterialsList( { front: frontMat, back: backMat, left: leftMat, right: rightMat, top: upMat, bottom: downMat }); cube = new Cube( imgMaterialList, 1000, 1000, 1000, 16, 16, 16 ); scene.addChild( cube ); } private function createHotspots():void { var colorMaterial:ColorMaterial = new ColorMaterial(); colorMaterial.doubleSided = true; colorMaterial.interactive = true; //radiateur var plane:Plane = new Plane( colorMaterial, 431, 242, 1, 1 ); plane.name = "radiateur"; plane.y = -70; plane.z = -200; plane.x = 500; plane.rotationY = -90; plane.addEventListener( InteractiveScene3DEvent.OBJECT_PRESS, onMouseDown); plane.addEventListener( InteractiveScene3DEvent.OBJECT_RELEASE, onMouseUp); scene.addChild( plane ); //armoire var plane2:Plane = new Plane( colorMaterial, 648, 642, 1, 1 ); plane2.name = "armoire"; plane2.y = 10; plane2.z = -120; plane2.x = -500; plane2.rotationY = -90; plane2.addEventListener( InteractiveScene3DEvent.OBJECT_PRESS, onMouseDown); plane2.addEventListener( InteractiveScene3DEvent.OBJECT_RELEASE, onMouseUp); scene.addChild( plane2 ); //force l'affichage des hotspots var vp:ViewportLayer = viewport.getChildLayer(plane, true); vp.addDisplayObject3D( plane2 ); vp.layerIndex = 1; vp.alpha = 0; } private function createTextfield():void { label = new TextField(); label.autoSize = TextFieldAutoSize.LEFT; label.background = true; label.border = true; var format:TextFormat = new TextFormat(); format.font = "Verdana"; format.color = 0xFF0000; format.size = 16; format.underline = true; label.defaultTextFormat = format; } private function onMouseDown( e:InteractiveScene3DEvent ):void { label.text = "clic sur "+ e.displayObject3D.name addChild(label); } private function onMouseUp(event:Event):void { removeChild(label); } override protected function onRenderTick(event:Event=null):void { camera.rotationY += ( mouseX - ( stage.width/2 ) ) / MAX_X_ROTATION; camera.rotationX += ( mouseY - ( stage.height/2 ) ) / MAX_X_ROTATION; //on limite la rotation verticale if( camera.rotationX > MAX_X_ROTATION ) { camera.rotationX = MAX_X_ROTATION; } if( camera.rotationX < - MAX_X_ROTATION ) { camera.rotationX = - MAX_X_ROTATION; } super.onRenderTick( event ); } } }