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

📄 sketchupcollada.as

📁 ActionScript写的3D图片展示功能
💻 AS
📖 第 1 页 / 共 2 页
字号:
				var i:int;			for( i=0; i < len; i++ )			{				// Swap z & y for Max (to make Y up and Z depth)				var vert:Object = semVertices[ i ];				var x :Number = Number( vert.X ) * scaling;				var y :Number = Number( vert.Y ) * scaling;				var z :Number = Number( vert.Z ) * scaling;					if( this._yUp )					vertices.push( new Vertex3D( -x, y, z ) );				else					vertices.push( new Vertex3D(  x, z, y ) );			}				// Faces			var faces    :Array = instance.geometry.faces = new Array();			var semFaces :Array = semantics.triangles;			len = semFaces.length;				// DEBUG			//trace( "Faces: " + len );				for( i=0; i < len; i++ )			{				// Triangle				var tri :Array = semFaces[i].VERTEX;				var a   :Vertex3D = vertices[ accVerts + tri[ 0 ] ];				var b   :Vertex3D = vertices[ accVerts + tri[ 1 ] ];				var c   :Vertex3D = vertices[ accVerts + tri[ 2 ] ];					var faceList :Array = [ a, b, c ];					var tex :Array = semantics.TEXCOORD;				var uv  :Array = semFaces[i].TEXCOORD;					var uvList :Array, uvA :NumberUV, uvB :NumberUV, uvC :NumberUV;					if( uv && tex )				{					uvA = new NumberUV( tex[ uv[0] ].S, tex[ uv[0] ].T );					uvB = new NumberUV( tex[ uv[1] ].S, tex[ uv[1] ].T );					uvC = new NumberUV( tex[ uv[2] ].S, tex[ uv[2] ].T );						uvList = [ uvA, uvB, uvC ];				}				else uvList = null;				var materialName:String = semFaces[i].material || null;				var face:Triangle3D = new Triangle3D(instance, faceList, _materials.getMaterialByName(materialName), uvList );				faces.push( face );			}							// Activate object			instance.geometry.ready = true;				matrix.n14 *= scaling;			matrix.n24 *= scaling;			matrix.n34 *= scaling;				instance.material = MaterialObject3D.DEFAULT;				instance.visible  = true;		}				private function getArray( spaced:String ):Array		{			var strings :Array = spaced.split(" ");			var numbers :Array = new Array();				var totalStrings:Number = strings.length;				for( var i:Number=0; i < totalStrings; i++ )				numbers[i] = Number( strings[i] );				return numbers;		}				private function addMaterial( instance:DisplayObject3D, name:String, bindMaterial:Object ):void		{			//trace( "Collada: addMaterial: " + instance.name + " > " + name ); // DEBUG			var material:MaterialObject3D;						if( this._materials ){				material = this._materials.getMaterialByName( name );			}else{				_materials = new MaterialsList();			}						if( ! material )			{				// Find object path				var path :String = this._filename.slice( 0, this._filename.lastIndexOf("/") +1 );					// Retrieve texture url				var filename :String = getTexture( bindMaterial[name] );					if( filename )				{					// Load relative to the object					materialsToLoad++;					material = new BitmapFileMaterial( path + filename );					material.addEventListener(FileLoadEvent.LOAD_COMPLETE, onMaterialLoadComplete);					material.addEventListener(FileLoadEvent.LOAD_ERROR, onMaterialLoadError);				}				else				{					material = MaterialObject3D.DEFAULT;					Papervision3D.log( "Collada material " + name + " not found." ); // TODO: WARNING				}					material.name = name;			}			_materials.addMaterial(material);				if( ! instance.materials ) instance.materials = new MaterialsList();						instance.materials.addMaterial( material, name );		}				private function onMaterialLoadComplete(event:FileLoadEvent):void		{			materialsToLoad--;			if(materialsToLoad == 0){				materials = new MaterialsList();				dispatchEvent(new FileLoadEvent(FileLoadEvent.COLLADA_MATERIALS_DONE));			}		}				private function onMaterialLoadError(event:FileLoadEvent):void		{			var mat:BitmapFileMaterial = event.target as BitmapFileMaterial;			trace("Colllada failed to load material : " +mat);			//Do error handling here.			materialsToLoad--;			if(materialsToLoad == 0){				dispatchEvent(new FileLoadEvent(FileLoadEvent.COLLADA_MATERIALS_DONE));			}		}				// Retrieves the filename of a material		private function getTexture( name:String ):String		{			var filename :String = null;				var material:XML = COLLADA.library_materials.material.(@id == name)[0];				if( material )			{				var effectId:String = getId( material.instance_effect.@url );				var effect:XML = COLLADA.library_effects.effect.(@id == effectId)[0];					if (effect..texture.length() == 0) return null;					var textureId:String = effect..texture[0].@texture;					var sampler:XML =  effect..newparam.(@sid == textureId)[0];					// Blender				var imageId:String = textureId;					// Not Blender				if( sampler )				{					var sourceId:String = sampler..source[0];					var source:XML =  effect..newparam.(@sid == sourceId)[0];						imageId = source..init_from[0];				}					var image:XML = COLLADA.library_images.image.(@id == imageId)[0];					filename = image.init_from;					if (filename.substr(0, 2) == "./")				{					filename = filename.substr( 2 );				}			}				return filename;		}				// _______________________________________________________________________		//                                                                Matrices			private function rotateMatrix( vector:Array ):Matrix3D		{			if( this._yUp )				return Matrix3D.rotationMatrix( vector[0], vector[1], vector[2], -vector[3] *toRADIANS );			else				return Matrix3D.rotationMatrix( vector[0], vector[2], vector[1], -vector[3] *toRADIANS );		}				private function translateMatrix( vector:Array ):Matrix3D		{			if( this._yUp )				return Matrix3D.translationMatrix( -vector[0] *this._scaling, vector[1] *this._scaling, vector[2] *this._scaling );			else				return Matrix3D.translationMatrix(  vector[0] *this._scaling, vector[2] *this._scaling, vector[1] *this._scaling );		}				private function scaleMatrix( vector:Array ):Matrix3D		{			if( this._yUp )				return Matrix3D.scaleMatrix( vector[0], vector[1], vector[2] );			else				return Matrix3D.scaleMatrix( vector[0], vector[2], vector[1] );		}			private function bakedMatrix( matrix:Matrix3D ):Matrix3D		{			matrix.n14 *= _scaling;			matrix.n24 *= _scaling;			matrix.n34 *= _scaling;						return matrix;		}			// _______________________________________________________________________		//                                                                     XML			private function deserialize( input:XML, geo:XML ):Array		{			var output :Array = new Array();			var id     :String = input.@source.split("#")[1];				// Source?			var acc:XMLList = geo..source.(@id == id).technique_common.accessor;				if( acc != new XMLList() )			{				// Build source floats array				var floId  :String  = acc.@source.split("#")[1];				var floXML :XMLList = COLLADA..float_array.(@id == floId);				var floStr :String  = floXML.toString();				var floats :Array   = floStr.split(" ");					// Build params array				var params :Array = new Array();					for each( var par:XML in acc.param )					params.push( par.@name );					// Build output array				var count  :int = acc.@count;				var stride :int = acc.@stride;					for( var i:int=0; i < count; i++ )				{					var element :Object = new Object();						for( var j:int=0; j < stride; j++ )						element[ params[j] ] = floats.shift();						//for( j=0; j < stride; j++ ) trace( params[j] + " " + element[ params[j] ] ); // DEBUG						output.push( element );				}			}			else			{				// Store indexes if no source				var recursive :XMLList = geo..vertices.(@id == id)[INPUTTAG];					output = deserialize( recursive[0], geo );			}				return output;		}			public function getMaterialsList():MaterialsList		{			return _materials;		}			private function getId( url:String ):String		{			return url.split("#")[1];		}			// _______________________________________________________________________		//                                                       COLLADA tag names			private static var COLLADASECTION  :String = "COLLADA";		private static var LIBRARYSECTION  :String = "library";		private static var ASSETSECTION    :String = "asset";		private static var SCENESECTION    :String = "scene";			private static var LIGHTPREFAB     :String = "light";		private static var CAMERAPREFAB    :String = "camera";		private static var MATERIALSECTION :String = "material";		private static var GEOMETRYSECTION :String = "geometry";			private static var MESHSECTION     :String = "mesh";		private static var SOURCESECTION   :String = "source";		private static var ARRAYSECTION    :String = "array";		private static var ACCESSORSECTION :String = "accessor";		private static var VERTICESSECTION :String = "vertices";		private static var INPUTTAG        :String = "input";		private static var POLYGONSSECTION :String = "polygons";		private static var POLYGON         :String = "p";		private static var NODESECTION     :String = "node";		private static var LOOKATNODE      :String = "lookat";		private static var MATRIXNODE      :String = "matrix";		private static var PERSPECTIVENODE :String = "perspective";		private static var ROTATENODE      :String = "rotate";		private static var SCALENODE       :String = "scale";		private static var TRANSLATENODE   :String = "translate";		private static var SKEWNODE        :String = "skew";		private static var INSTANCENODE    :String = "instance";		private static var INSTACESCENE    :String = "instance_visual_scene";			private static var PARAMTAG        :String = "param";			private static var POSITIONINPUT   :String = "POSITION";		private static var VERTEXINPUT     :String = "VERTEX";		private static var NORMALINPUT     :String = "NORMAL";		private static var TEXCOORDINPUT   :String = "TEXCOORD";		private static var UVINPUT         :String = "UV";		private static var TANGENTINPUT    :String = "TANGENT";			// _______________________________________________________________________			private var COLLADA     :XML;		private var _container  :DisplayObjectContainer3D;		private var _geometries :Object;			private var _loader     :URLLoader;			private var _filename   :String;		private var _materials  :MaterialsList;		private var _scaling    :Number;			private var _yUp        :Boolean;			static private var toDEGREES :Number = 180/Math.PI;		static private var toRADIANS :Number = Math.PI/180;	}}

⌨️ 快捷键说明

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