返回 导航

Flex

hangge.com

Away3D - 给加载进来的3D模型设置皮肤(3ds格式为例)

作者:hangge | 2016-07-01 08:55
在前文中:Away3D - 加载外部的3D模型(3ds格式为例)。演示了如何在 Away3D 工程项目中加载 3d 模型。对于 3ds 格式的模型来说,通常其内部就已经定义好对应的贴图名字了。但也有时候模型中并没有将所有对象的皮肤图片都设置好,这是我们就需要在模型加载完毕后动态地添加皮肤纹理了。

1,缺少部分皮肤的模型演示
下面是一个盆栽的模型,我们将其加载到舞台上会发现,虽然叶子提供了贴图,下方的花盆却没有。最终效果就是花盆白花花一片,表面纹理细节都看不到。

2,给花盆添加纹理皮肤
(1)通过 LoaderEvent.RESOURCE_COMPLETE 的响应方法,我们可以在模型加载完毕后设置其内部各个对象的皮肤。(当然也可以修改原来默认的皮肤)
(2)由于模型不是我做的,所以我并不知道花盆对应的名字。只能遍历 mesh,然后一个一个试了。(最后发现花盆由上下两部分组成,mesh.name 为"3dstylish0"和"3dstylish3")

(3)这里给花盆简单地添加个纯色资源(白色),并添加个灯光。
package{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Vector3D;
	import flash.net.URLRequest;
	
	import away3d.containers.View3D;
	import away3d.controllers.HoverController;
	import away3d.entities.Mesh;
	import away3d.events.LoaderEvent;
	import away3d.lights.PointLight;
	import away3d.loaders.Loader3D;
	import away3d.loaders.parsers.Max3DSParser;
	import away3d.materials.ColorMaterial;
	import away3d.materials.TextureMaterial;
	import away3d.materials.lightpickers.StaticLightPicker;
	
	[SWF(frameRate="60", backgroundColor="#FFFFFF")]
	public class ModelLoader extends Sprite {
		
		private  var _view3D:View3D;
		private var cameraController:HoverController;//360全景展示相机控制器
		
		//用来加载3D模型
		private var loader:Loader3D;
		
		//地板材质 
		private var floorMaterial:TextureMaterial;
		
		private var _lastX:Number = 0;
		private var _lastY:Number = 0;
		
		//灯光对象
		private var light1:PointLight; //点光源
		private var light2:PointLight; //点光源
		private var light3:PointLight; //点光源
		private var lightPicker:StaticLightPicker;  //灯光容器

		public function ModelLoader() {
			initEngine();
			initLights();
			initMaterials();
			initObjects();
			initListeners();
		}
		
		/**
		 * 初始化引擎
		 */
		private function initEngine():void
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			
			// 创建一个视口
			_view3D = new View3D();
			_view3D.antiAlias = 4; //设置抗锯齿级别
			
			//初始化摄像头
			cameraController = new HoverController(_view3D.camera);
			cameraController.tiltAngle = 15;
			
			addChild(_view3D);
		}
		
		/**
		 * 初始化灯光
		 */
		private function initLights():void
		{
			//点光源
			light1 = new PointLight();
			light1.position =  new Vector3D(400, 800, 800);
			light1.color = 0xffffEB
			light1.ambient = 0.3; 
			
			light2 = new PointLight();
			light2.position =  new Vector3D(-400, 800, 800);
			light2.color = 0xffffEB
			light2.ambient = 0.1; 
			
			light3 = new PointLight();
			light3.position =  new Vector3D(0, 400, -800);
			light3.color = 0xffffEB
			light3.ambient = 0.05; 
			
			//添加到灯光容器中
			lightPicker = new StaticLightPicker([light1,light2,light3]);
		}
		
		/**
		 * 初始化材质
		 */
		private function initMaterials():void
		{
		}
		
		/**
		 * 初始化物体
		 */
		private function initObjects():void
		{
			loadModel("3dstylish_dvs001.3DS");
		}
		
		/**
		 * 加载模型
		 */
		public function loadModel(product:String):void {
			Loader3D.enableParser(Max3DSParser);
			loader = new Loader3D();
			loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, onModelLoaded);
			loader.load(new URLRequest("assets3/" + product)); 
			loader.scale(3);
			_view3D.scene.addChild(loader);
		}
		
		/**
		 * 模型加载完毕
		 */
		private function onModelLoaded(e: LoaderEvent) : void
		{
			var i:int;
			var mesh:Mesh;
			var numChil:uint = loader.numChildren;
			for (i = 0; i < numChil; ++i)
			{
				mesh = Mesh(loader.getChildAt(i));
				trace(mesh.name);
				//设置画盆的皮肤
				if(mesh.name == "3dstylish3" || mesh.name == "3dstylish0"){
					//给花盆设置皮肤和灯光
					var mat:ColorMaterial;
					mat = new ColorMaterial(0xCCCCCC, 1);
					mat.lightPicker = lightPicker;
					mesh.material = mat;
				}
			}
		} 
		
		/**
		 * 初始化监听
		 */
		private function initListeners():void
		{
			addEventListener(Event.ENTER_FRAME, _onEnterFrame);
			//鼠标事件监听
			stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			stage.addEventListener(MouseEvent.MOUSE_WHEEL,onWheel);
			stage.addEventListener(Event.RESIZE, onResize);
			onResize();
		}
		
		/**
		 * 渲染视图
		 */
		private function _onEnterFrame(e:Event):void
		{
			//渲染视图
			_view3D.render();
		}
		
		/**
		 * 使用舞台大小一直全屏
		 */
		private function onResize(event:Event = null):void
		{
			_view3D.width = stage.stageWidth;
			_view3D.height = stage.stageHeight;
		}
		
		/**
		 * 鼠标滚轮事件
		 */
		private function onWheel(e:MouseEvent):void
		{
			if(e.delta > 0){
				if(cameraController.distance < 1000)
					cameraController.distance += 100;
			}else{
				if(cameraController.distance > 600)
					cameraController.distance -= 100;
			}
		}
		
		/**
		 * 鼠标按下事件
		 */
		private function onMouseDown(event:MouseEvent):void
		{
			_view3D.stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			_lastX = _view3D.mouseX;
			_lastY = _view3D.mouseY;
		}
		
		/**
		 * 鼠标弹起事件
		 */
		private function onMouseUp(event:MouseEvent):void
		{
			_view3D.stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
		}
		
		/**
		 * 鼠标移动事件
		 */
		private function mouseMoveHandler(event:MouseEvent):void
		{
			//移动摄像机
			var dx:Number = _view3D.mouseX - _lastX;
			var dy:Number = _view3D.mouseY - _lastY;
			
			cameraController.panAngle += dx;
			cameraController.tiltAngle += dy;
			
			_lastX = _view3D.mouseX;
			_lastY = _view3D.mouseY;
		}
	}
}

3,最终效果图

相关资源包下载:assets3.zip
评论

全部评论(0)

回到顶部