away3d 4.1 alpha 教程 模型篇 <1> 之 away3d 4.0 天地会 高清汽车案例 全解析
1.车库类 全解析
package objects3D.environments { import away3d.containers.ObjectContainer3D; import away3d.entities.Mesh; import away3d.events.AssetEvent; import away3d.library.assets.AssetType; import away3d.lights.DirectionalLight; import away3d.loaders.Loader3D; import away3d.materials.TextureMaterial; import away3d.materials.lightpickers.StaticLightPicker; import away3d.materials.methods.TerrainDiffuseMethod; import away3d.primitives.PlaneGeometry; import away3d.textures.BitmapTexture; public class Garage extends ObjectContainer3D { [Embed(source="garage/FloorMap.jpg")] private var FloorMapAsset:Class; [Embed(source="garage/GarageMap.jpg")] private var GarageMapAsset:Class; [Embed(source="garage/FloorShadowMap.png", mimeType="image/png")] private var FloorShadowMapAsset:Class; [Embed(source="garage/Garage.3DS", mimeType="application/octet-stream")] private var GarageAsset:Class; private var garageMesh:Mesh; private var floorMesh:Mesh; private var floorShadowMesh:Mesh; public function Garage(param1:DirectionalLight = null) { var floorMapTexture:BitmapTexture = new BitmapTexture(new this.FloorMapAsset().bitmapData); var floorMap:TextureMaterial = new TextureMaterial(floorMapTexture, true, true);//贴图,平滑,重复 floorMap.specular = 1;//反射 floorMap.lightPicker = new StaticLightPicker([param1]);//贴图拾取灯光 floorMap.diffuseMethod = new TerrainDiffuseMethod([floorMapTexture], new BitmapTexture(new this.FloorShadowMapAsset().bitmapData), [10]);//为地面贴图添加凹凸贴图 var floorShadow:TextureMaterial = new TextureMaterial(new BitmapTexture(new this.FloorShadowMapAsset().bitmapData));//创建影子贴图png floorShadow.alpha = 0.9; this.floorMesh = new Mesh(new PlaneGeometry(3800, 3800), floorMap);//创建地面面片,贴上上面生成的地面贴图 this.floorMesh.y = -238; this.floorMesh.rotationY = -95; this.floorShadowMesh = new Mesh(new PlaneGeometry(3800, 3800), floorShadow);//创建影子面片,贴上影子贴图png this.floorShadowMesh.y = -237;//影子面片放置于地面面片之上 this.floorShadowMesh.rotationY = -95; var garageLoader:Loader3D = new Loader3D();//实例模型加载器 garageLoader.addEventListener(AssetEvent.ASSET_COMPLETE, this.complete); garageLoader.loadData(new this.GarageAsset(), null, null); super.addChildren(this.floorMesh, this.floorShadowMesh); } private function complete(event:AssetEvent):void { if (event.asset.assetType == AssetType.MESH) { garageMesh = event.asset as Mesh;//将模型转换成面片 garageMesh.material = new TextureMaterial(new BitmapTexture(new this.GarageMapAsset().bitmapData), true);//为加载进来的模型上贴图 garageMesh.roll(180);//绕着旋转180度 garageMesh.geometry.scale(3); super.addChild(this.garageMesh); super.y = 188; } } } }
2.摄像机控制 OrbitControllerExtended.as
其实摄像机控制就是我之前整理的
away3d 4.0.9Gold 学习笔记 摄像机与摄像机控制器(7)
这里我就在看看这个类中的用法,再做一次总结
OrbitControllerExtended.as
package controllers { import away3d.cameras.*; import away3d.containers.*; import away3d.controllers.*; import flash.display.*; import flash.events.*; public class OrbitControllerExtended extends Object { private var _camera:Camera3D; private var _stage:DisplayObject; private var _target:ObjectContainer3D; private var isMouseDown:Boolean = false; private var lastPanAngle:Number; private var lastTiltAngle:Number; private var lastMouseX:Number; private var lastMouseY:Number; public var fov:Number = 800; public var mainController:HoverController; private var _activate:Boolean = true; public function OrbitControllerExtended(param1:Camera3D, param2:DisplayObject, param3:ObjectContainer3D = null) { this._camera = param1; this._stage = param2; this._target = param3; this.mainController = new HoverController(this._camera, this._target, 180, 20, this.fov, 0, 35, NaN, NaN, 6, 1); } public function set activate(param1:Boolean):void { this._activate = param1; } public function get activate():Boolean { return this._activate; } private function activateController(param1:Boolean):void { if (param1) { this._stage.addEventListener(MouseEvent.MOUSE_DOWN, this.stageMouseDown); this._stage.addEventListener(MouseEvent.MOUSE_UP, this.stageMouseUp); this._stage.addEventListener(MouseEvent.MOUSE_WHEEL, this.stageMouseWheel); } else { this._stage.removeEventListener(MouseEvent.MOUSE_DOWN, this.stageMouseDown); this._stage.removeEventListener(MouseEvent.MOUSE_UP, this.stageMouseUp); this._stage.removeEventListener(MouseEvent.MOUSE_WHEEL, this.stageMouseWheel); } } private function stageMouseDown(event:MouseEvent):void { this.lastPanAngle = this.mainController.panAngle; this.lastTiltAngle = this.mainController.tiltAngle; this.lastMouseX = this._stage.mouseX; this.lastMouseY = this._stage.mouseY; this.isMouseDown = true; } private function stageMouseUp(event:MouseEvent):void { this.isMouseDown = false; } private function stageMouseWheel(event:MouseEvent):void { var value:Number = this.fov - event.delta / 0.5; if (value < 590) { value = 590; } if (value > 950) { value = 950; } this.fov = value; } public function update():void { if (this._activate) { this.activateController(true); this.mainController.update(); this.mainController.distance = this.mainController.distance + (this.fov - this.mainController.distance) / 8; if (this.isMouseDown) { this.mainController.panAngle = 0.3 * (this._stage.mouseX - this.lastMouseX) + this.lastPanAngle; this.mainController.tiltAngle = 0.3 * (this._stage.mouseY - this.lastMouseY) + this.lastTiltAngle; } } else { this.activateController(false); } } } }
3.车的 创建
4.如何用4.1版本的动态反射用于此案例