⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dae.as

📁 ActionScript写的3D图片展示功能
💻 AS
📖 第 1 页 / 共 3 页
字号:
package org.papervision3d.objects.parsers{	import flash.events.Event;	import flash.events.ProgressEvent;	import flash.utils.ByteArray;	import flash.utils.Dictionary;		import org.ascollada.ASCollada;	import org.ascollada.core.*;	import org.ascollada.fx.*;	import org.ascollada.io.DaeReader;	import org.ascollada.namespaces.*;	import org.ascollada.types.*;	import org.papervision3d.core.animation.*;	import org.papervision3d.core.animation.channel.*;	import org.papervision3d.core.geom.*;	import org.papervision3d.core.geom.renderables.*;	import org.papervision3d.core.material.AbstractLightShadeMaterial;	import org.papervision3d.core.math.*;	import org.papervision3d.core.proto.*;	import org.papervision3d.events.FileLoadEvent;	import org.papervision3d.materials.*;	import org.papervision3d.materials.shaders.ShadedMaterial;	import org.papervision3d.materials.special.*;	import org.papervision3d.materials.utils.*;	import org.papervision3d.objects.DisplayObject3D;	import org.papervision3d.objects.special.Joint3D;	import org.papervision3d.objects.special.Skin3D;		/**	 * @author Tim Knip	 */ 	public class DAE extends DisplayObject3D implements IAnimationDataProvider	{		use namespace collada;				/** Default line color for splines. */		public static var DEFAULT_LINE_COLOR:uint = 0xffff00;				/** Default line width for splines */		public static var DEFAULT_LINE_WIDTH:Number = 0;				/** */		public var COLLADA:XML;			/** */		public var filename:String;				/** */		public var fileTitle:String;				/** */		public var baseUrl:String;				/** Path where the textures should be loaded from. */		public var texturePath:String;				/** */		public var parser:DaeReader;				/** */		public var document:DaeDocument;				/**		 * Constructor.		 */ 		public function DAE()		{			super();		}				/**		 * Gets the default FPS.		 */ 		public function get fps():uint		{			return 20;		}				/**		 * Gets a animation channel by its name.		 * 		 * @param	name		 * 		 * @return the found channel.		 */ 		public function getAnimationChannelByName(name:String):AbstractChannel3D		{			return null;			}				/**		 * Gets all animation channels for a target. 		 * <p>NOTE: when target is null, all channels for this object are returned.</p>		 * 		 * @param	target	The target to get the channels for.		 * 		 * @return	Array of AnimationChannel3D.		 */ 		public function getAnimationChannels(target:DisplayObject3D=null):Array		{			var channels:Array = new Array();			if(target == null)			{				for each(var array:Array in _channelsByTarget)					channels = channels.concat(array);			}			else if(_channelsByTarget[target])			{				channels = channels.concat(_channelsByTarget[target]);			}			else				return null;								return channels;		}				/**		 * Gets animation channels by clip name.		 * 		 * @param	name	The clip name		 * 		 * @return	Array of AnimationChannel3D.		 */ 		public function getAnimationChannelsByClip(name:String):Array		{			return null;			}				/**		 * Loads the COLLADA.		 * 		 * @param	asset The url, an XML object or a ByteArray specifying the COLLADA file.		 * @param	materials	An optional materialsList.		 */ 		public function load(asset:*, materials:MaterialsList = null):void		{			this.materials = materials || new MaterialsList();						buildFileInfo(asset);						this.parser = new DaeReader();			this.parser.addEventListener(Event.COMPLETE, onParseComplete);			this.parser.addEventListener(ProgressEvent.PROGRESS, onParseProgress);						if(asset is XML)			{				this.COLLADA = asset as XML;				this.parser.loadDocument(asset);			}			else if(asset is ByteArray)			{				this.COLLADA = new XML(ByteArray(asset));				this.parser.loadDocument(asset);			}			else if(asset is String)			{				this.filename = String(asset);				this.parser.read(this.filename);			}			else			{				throw new Error("load : unknown asset type!");			}		}				/**		 * Removes a child.		 * 		 * @param	child	The child to remove		 * 		 * @return	The removed child		 */ 		override public function removeChild(child:DisplayObject3D):DisplayObject3D		{			var object:DisplayObject3D = getChildByName(child.name, true);						if(object)			{				var parent:DisplayObject3D = DisplayObject3D(object.parent);				if(parent)				{					var removed:DisplayObject3D = parent.removeChild(object);					if(removed)						return removed;				}			}			return null;			}				/**		 * Replaces a material by its name.		 * 		 * @param	material		 * @param	name		 * @return		 */		public function replaceMaterialByName(material:MaterialObject3D, name:String):void		{			if(!this.materials)				return;						var existingMaterial:MaterialObject3D = this.materials.getMaterialByName(name);			if(!existingMaterial)				return;							if(this.material === existingMaterial)				this.material = material;			existingMaterial = this.materials.removeMaterial(existingMaterial);			existingMaterial.unregisterObject(this);							material = this.materials.addMaterial(material, name);							updateMaterials(this, existingMaterial, material);		}				/**		 * Replaces materials by its name.		 * 		 * @param	materials		 */		public function replaceMaterials(materials:MaterialsList):void		{					}				/**		 * Sets the material for a child DisplayObject3D.		 * 		 * @param child		A child DisplayObject3D of this DAE.		 * @param material	The new material for the child.		 */		public function setChildMaterial(child:DisplayObject3D, material:MaterialObject3D ):void 		{				if(!child) 				return;				child.material = material;			if(child.geometry && child.geometry.faces)			{				for each( var triangle:Triangle3D in child.geometry.faces )					triangle.material = material;			}		}				/**		 * Sets the material for a child DisplayObject3D by the child's name.		 * 		 * @param childName The name of the DisplayObject3D.		 * @param material	The new material for the child.		 */		public function setChildMaterialByName(childName:String, material:MaterialObject3D):void 		{			setChildMaterial(getChildByName(childName, true), material);		}				/**		 * Builds a animation channel for an object.		 * 		 * @param	matrixStackChannel	the target object's channel		 * @param	target	The target object		 * @param	channel	The DaeChannel		 */ 		private function buildAnimationChannel(target:DisplayObject3D, channel:DaeChannel):MatrixChannel3D		{			//if(channel.syntax.isArrayAccess)			//	return;							var node:DaeNode = _objectToNode[target];								if(!node)				throw new Error("Couldn't find the targeted object!");								var matrixChannel:MatrixChannel3D = new MatrixChannel3D(this, target, channel.syntax.targetSID);						var transform:DaeTransform = node.findMatrixBySID(channel.syntax.targetSID);								if(!transform)				throw new Error("Couldn't find the targeted object's transform!");						var matrix:Matrix3D;			var matrixProp:String;			var arrayMember:String;			var data:Array;			var i:int;									if(channel.syntax.isArrayAccess)			{				arrayMember = channel.syntax.arrayMember.join("");								switch(arrayMember)				{					case "(0)(0)":						matrixProp = "n11";						break;					case "(1)(0)":						matrixProp = "n12";						break;					case "(2)(0)":						matrixProp = "n13";						break;					case "(3)(0)":						matrixProp = "n14";						break;					case "(0)(1)":						matrixProp = "n21";						break;					case "(1)(1)":						matrixProp = "n22";						break;					case "(2)(1)":						matrixProp = "n23";						break;					case "(3)(1)":						matrixProp = "n24";						break;					case "(0)(2)":						matrixProp = "n31";						break;					case "(1)(2)":						matrixProp = "n32";						break;					case "(2)(2)":						matrixProp = "n33";						break;					case "(3)(2)":						matrixProp = "n34";						break;					default:						throw new Error(arrayMember);				}			}								switch(transform.type)			{				case "matrix":					if(channel.syntax.isFullAccess)					{						for(i = 0; i < channel.input.length; i++)						{							data = channel.output[i];							matrix = new Matrix3D(data);							matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix]));						}					}					else if(channel.syntax.isArrayAccess)					{						matrix = Matrix3D.clone(target.transform);												for(i = 0; i < channel.input.length; i++)						{							matrix[matrixProp] = channel.output[i];							matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix]));						}					}					else					{						throw new Error("Don't know how to handle this channel: " + channel.syntax);					}					break;				case "rotate":					if(channel.syntax.isFullAccess)					{						for(i = 0; i < channel.input.length; i++)						{							data = channel.output[i];							matrix = Matrix3D.rotationMatrix(data[0], data[1], data[2], data[3] * (Math.PI/180));							matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix]));						}					}					else if(channel.syntax.isDotAccess)					{						switch(channel.syntax.member)						{							case "ANGLE":								for(i = 0; i < channel.input.length; i++)								{									var angle:Number = channel.output[i] * (Math.PI/180);									matrix = Matrix3D.rotationMatrix(transform.values[0], transform.values[1], transform.values[2], angle);									matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix]));								}								break;							default:								throw new Error("Don't know how to handle this channel: " + channel.syntax);						}					}					else					{						throw new Error("Don't know how to handle this channel: " + channel.syntax);					}						break;				case "scale":					if(channel.syntax.isFullAccess)					{						for(i = 0; i < channel.input.length; i++)						{							data = channel.output[i];							matrix = Matrix3D.scaleMatrix(data[0], data[1], data[2]);							matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix]));						}					}					else					{						throw new Error("Don't know how to handle this channel: " + channel.syntax);					}					break;				case "translate":					if(channel.syntax.isFullAccess)					{						for(i = 0; i < channel.input.length; i++)						{							data = channel.output[i];							matrix = Matrix3D.translationMatrix(data[0], data[1], data[2]);							matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix]));						}					}						else					{						throw new Error("Don't know how to handle this channel: " + channel.syntax);					}							break;				default:					throw new Error("Unknown transform type!");				}						return matrixChannel;		}				/**		 * Build all animation channels.		 */ 		private function buildAnimationChannels():void		{			var target:DisplayObject3D;			var channel:DaeChannel;			var channelsByObject:Dictionary = new Dictionary(true);			var i:int;						_channelsByTarget = new Dictionary(true);						for each(var animation:DaeAnimation in this.document.animations)			{				for(i = 0; i < animation.channels.length; i++)				{					channel = animation.channels[i];										target = _colladaIDToObject[channel.syntax.targetID];					if(!target)						throw new Error("damn");											if(!channelsByObject[target])						channelsByObject[target] = new Array();										channelsByObject[target].push(channel);				}			}						for(var object:* in channelsByObject)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -