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

📄 dae.as.svn-base

📁 ActionScript写的3D图片展示功能
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
			{				target = object as DisplayObject3D;											var channels:Array = channelsByObject[object];				var node:DaeNode = _objectToNode[target];									if(!node)					throw new Error("Couldn't find the targeted object!");									node.channels = channels;											if(channels.length == 1)				{					channel = channels[0];												var transform:DaeTransform = node.findMatrixBySID(channel.syntax.targetSID);					if(!transform)						throw new Error("Couldn't find the targeted object's transform!");										if(transform.type == ASCollada.DAE_MATRIX_ELEMENT)					{							_channelsByTarget[target] = [buildAnimationChannel(target, channel)];						continue;					}				}								bakeAnimationChannels(node, target);			}		}				private function bakeAnimationChannels(node:DaeNode, target:DisplayObject3D):void		{			var i:int, j:int;			var stack:Array = buildMatrixStack(node);			var channels:Array = new Array();						for(i = 0; i < node.channels.length; i++)				channels.push(buildAnimationChannel(target, node.channels[i]));							var outputs:Array = new Array(channels.length);			var keyFrames:Array = new Array();			var dummy:DisplayObject3D = DisplayObject3D.ZERO;			var times:Array = new Array();						for(i = 0; i < channels.length; i++)			{				var matrixChannel:MatrixChannel3D = channels[i];								outputs[i] = new Array(matrixChannel.keyFrames.length);								for(j = 0; j < matrixChannel.keyFrames.length; j++)				{					matrixChannel.updateToFrame(j, dummy);					outputs[i][j] = matrixChannel.output[0];									times.push(matrixChannel.keyFrames[j].time);				}			}						trace("TIMES: " + times);		}				/**		 * Build a color from RGB values.		 * 		 * @param	rgb		 *  		 * @return		 */		private function buildColor( rgb:Array ):uint		{			var r:uint = rgb[0] * 0xff;			var g:uint = rgb[1] * 0xff;			var b:uint = rgb[2] * 0xff;			return (r<<16|g<<8|b);		}				/**		 * Creates the faces for a COLLADA primitive. @see org.ascollada.core.DaePrimitive		 * 		 * @param 	primitive		 * @param	geometry		 * @param	voffset		 * 		 * @return 	The created faces.		 */ 		private function buildFaces(primitive:DaePrimitive, geometry:GeometryObject3D, voffset:uint):void		{			var faces:Array = new Array();			var material:MaterialObject3D = this.materials.getMaterialByName(primitive.material);						if(!material)			{				material = new CompositeMaterial();				CompositeMaterial(material).addMaterial(new ColorMaterial(0xff0000, 0.5));				CompositeMaterial(material).addMaterial(new WireframeMaterial(0));			}						// retreive correct texcoord-set for the material.			var obj:DaeBindVertexInput = _textureSets[primitive.material] is DaeBindVertexInput ? _textureSets[primitive.material] : null;			var setID:int = (obj is DaeBindVertexInput) ? obj.input_set : 0;			var texCoordSet:Array = primitive.getTexCoords(setID); 			var texcoords:Array = new Array();			var i:int, j:int = 0, k:int;						// texture coords			for( i = 0; i < texCoordSet.length; i++ ) 				texcoords.push(new NumberUV(texCoordSet[i][0], texCoordSet[i][1]));						var hasUV:Boolean = (texcoords.length == primitive.vertices.length);			var idx:Array = new Array();			var v:Array = new Array();			var uv:Array = new Array();						switch( primitive.type ) 			{				// Each line described by the mesh has two vertices. The first line is formed 				// from first and second vertices. The second line is formed from the third and fourth 				// vertices and so on.				case ASCollada.DAE_LINES_ELEMENT:					for( i = 0; i < primitive.vertices.length; i += 2 ) 					{						v[0] = geometry.vertices[ primitive.vertices[i] ];						v[1] = geometry.vertices[ primitive.vertices[i+1] ];						uv[0] = hasUV ? texcoords[  i  ] : new NumberUV();						uv[1] = hasUV ? texcoords[ i+1 ] : new NumberUV();						//geometry.faces.push( new Triangle3D(instance, [v[0], v[1], v[1]], material, [uv[0], uv[1], uv[1]]) );					}					break;									// simple triangles				case ASCollada.DAE_TRIANGLES_ELEMENT:					for(i = 0, j = 0; i < primitive.vertices.length; i += 3, j++) 					{						idx[0] = voffset + primitive.vertices[i];						idx[1] = voffset + primitive.vertices[i+1];						idx[2] = voffset + primitive.vertices[i+2];												v[0] = geometry.vertices[ idx[0] ];						v[1] = geometry.vertices[ idx[1] ];						v[2] = geometry.vertices[ idx[2] ];												uv[0] = hasUV ? texcoords[ i+0 ] : new NumberUV();						uv[1] = hasUV ? texcoords[ i+1 ] : new NumberUV();						uv[2] = hasUV ? texcoords[ i+2 ] : new NumberUV();												geometry.faces.push(new Triangle3D(null, [v[2], v[1], v[0]], material, [uv[2], uv[1], uv[0]]));					}					break;				// polygon with *no* holes				case ASCollada.DAE_POLYLIST_ELEMENT:					for( i = 0, k = 0; i < primitive.vcount.length; i++ ) 					{						var poly:Array = new Array();						var uvs:Array = new Array();						for( j = 0; j < primitive.vcount[i]; j++ ) 						{							uvs.push( (hasUV ? texcoords[ k ] : new NumberUV()) );							poly.push( geometry.vertices[primitive.vertices[k++]] );						}												if( !geometry || !geometry.faces || !geometry.vertices )							throw new Error( "no geometry" );													v[0] = poly[0];						uv[0] = uvs[0];												for( j = 1; j < poly.length - 1; j++ )						{							v[1] = poly[j];							v[2] = poly[j+1];							uv[1] = uvs[j];							uv[2] = uvs[j+1];							geometry.faces.push(new Triangle3D(null, [v[2], v[1], v[0]], material, [uv[2], uv[1], uv[0]]));						}					}					break;										default:					throw new Error("Don't know how to create face for a DaePrimitive with type = " + primitive.type);			}		}				/**		 * 		 * @param	asset		 * @return		 */		private function buildFileInfo( asset:* ):void		{			this.filename = asset is String ? String(asset) : "./meshes/rawdata_dae";						// make sure we've got forward slashes!			this.filename = this.filename.split("\\").join("/");							if( this.filename.indexOf("/") != -1 )			{				// dae is located in a sub-directory of the swf.				var parts:Array = this.filename.split("/");				this.fileTitle = String( parts.pop() );				this.baseUrl = parts.join("/");			}			else			{				// dae is located in root directory of swf.				this.fileTitle = this.filename;				this.baseUrl = "";			}		}				/**		 * Builds all COLLADA geometries.		 */ 		private function buildGeometries():void		{			var i:int, j:int, k:int;						_geometries = new Object();						for each(var geometry:DaeGeometry in this.document.geometries)			{				if(geometry.mesh)				{					var g:GeometryObject3D = new GeometryObject3D();										g.vertices = buildVertices(geometry.mesh);					g.faces = new Array();										for(i = 0; i < geometry.mesh.primitives.length; i++)					{						buildFaces(geometry.mesh.primitives[i], g, 0);					}										_geometries[geometry.id] = g;				}				else if(geometry.spline && geometry.splines)				{					var lines:Lines3D = new Lines3D(new LineMaterial(DEFAULT_LINE_COLOR), geometry.id);										for(i = 0; i < geometry.splines.length; i++)					{						var spline:DaeSpline = geometry.splines[i];												for(j = 0; j < spline.vertices.length; j++)						{							k = (j+1) % spline.vertices.length;														var v0:Vertex3D = new Vertex3D(spline.vertices[j][0], spline.vertices[j][1], spline.vertices[j][2]);							var v1:Vertex3D = new Vertex3D(spline.vertices[k][0], spline.vertices[k][1], spline.vertices[k][2]);													var line:Line3D = new Line3D(lines, lines.material as LineMaterial, DEFAULT_LINE_WIDTH, v0, v1);														lines.addLine(line);						}					}										_geometries[geometry.id] = lines;				}			}			}				/**		 *		 * @return		 */		private function buildImagePath( meshFolderPath:String, imgPath:String ):String		{			if (texturePath != null)				imgPath = texturePath + imgPath.slice( imgPath.lastIndexOf("/") + 1 );						var baseParts:Array = meshFolderPath.split("/");			var imgParts:Array = imgPath.split("/");						while( baseParts[0] == "." )				baseParts.shift();							while( imgParts[0] == "." )				imgParts.shift();							while( imgParts[0] == ".." )			{				imgParts.shift();				baseParts.pop();			}									var imgUrl:String = baseParts.length > 1 ? baseParts.join("/") : (baseParts.length?baseParts[0]:"");									imgUrl = imgUrl != "" ? imgUrl + "/" + imgParts.join("/") : imgParts.join("/");						return imgUrl;		}				/**		 * Builds the materials.		 */ 		private function buildMaterials():void		{			_queuedMaterials = new Array();						for( var materialId:String in this.document.materials )			{				var material:DaeMaterial = this.document.materials[ materialId ];				var symbol:String = this.document.materialTargetToSymbol[ material.id ];											// material already exists in our materialsList, no need to process				if(this.materials.getMaterialByName(symbol))					continue;									var effect:DaeEffect = document.effects[ material.effect ];								var lambert:DaeLambert = effect.color as DaeLambert;								// save the texture-set if necessary				if(lambert && lambert.diffuse.texture)					_textureSets[material.id] = lambert.diffuse.texture.texcoord;									// if the material has a texture, qeueu the bitmap				if(effect && effect.texture_url)				{									var image:DaeImage = document.images[effect.texture_url];					if(image)					{						var imageUrl:String = buildImagePath(this.baseUrl, image.init_from);												_queuedMaterials.push({symbol:symbol, url:imageUrl});						continue;					}				}				if(lambert && lambert.diffuse.color)					this.materials.addMaterial(new ColorMaterial(buildColor(lambert.diffuse.color)), symbol);				else					this.materials.addMaterial(MaterialObject3D.DEFAULT, symbol);			}		}				/**		 * Builds a Matrix3D from a node's transform array. @see org.ascollada.core.DaeNode#transforms		 * 		 * @param	node		 * 		 * @return		 */		private function buildMatrix(node:DaeNode):Matrix3D 		{			var stack:Array = buildMatrixStack(node);			var matrix:Matrix3D = Matrix3D.IDENTITY;			for( var i:int = 0; i < stack.length; i++ ) 				matrix.calculateMultiply4x4(matrix, stack[i]);			return matrix;		}				/**		 * 		 * @param	node		 * @return		 */		private function buildMatrixStack(node:DaeNode):Array		{			var toRadians:Number = Math.PI/180;			var stack:Array = new Array();						for( var i:int = 0; i < node.transforms.length; i++ ) 			{				var transform:DaeTransform = node.transforms[i];				var v:Array = transform.values;								var matrix:Matrix3D;								switch(transform.type)				{					case ASCollada.DAE_ROTATE_ELEMENT:						matrix = Matrix3D.rotationMatrix(v[0], v[1], v[2], v[3] * toRadians);						break;					case ASCollada.DAE_SCALE_ELEMENT:						matrix = Matrix3D.scaleMatrix(v[0], v[1], v[2]);						break;					case ASCollada.DAE_TRANSLATE_ELEMENT:						matrix = Matrix3D.translationMatrix(v[0], v[1], v[2]);						break;					case ASCollada.DAE_MATRIX_ELEMENT:						matrix = new Matrix3D(v);						break;					default:						throw new Error("Unknown transform type: " + transform.type);				}								stack.push(matrix);			}			return stack;		}				/**		 * Builds a DisplayObject3D from a node. @see org.ascollada.core.DaeNode		 * 		 * @param	node			 * 		 * @return	The created DisplayObject3D. @see org.papervision3d.objects.DisplayObject3D		 */ 		private function buildNode(node:DaeNode, parent:DisplayObject3D):void		{			var instance:DisplayObject3D;			var material:MaterialObject3D;			var i:int;						if(node.controllers.length)			{				// controllers, can be of type 'skin' or 'morph'				for(i = 0; i < node.controllers.length; i++)				{					var instanceController:DaeInstanceController = node.controllers[i];					var colladaController:DaeController = document.controllers[instanceController.url];					if(colladaController.skin)					{						instance = new Skin3D(null, [], [], node.name);												buildSkin(instance as Skin3D, colladaController.skin, instanceController.skeletons);					}					else if(colladaController.morph)					{						throw new Error("morph!");					}					else						throw new Error("A COLLADA controller should be of type <skin> or <morph>!");									// dunnu yet how to handle multiple controllers.					break;				}			}			else if(node.geometries.length)			{				// got geometry, so create a TriangleMesh3D				instance = new TriangleMesh3D(null, [], [], node.name);								// add all COLLADA geometries to the TriangleMesh3D				for each(var geom:DaeInstanceGeometry in node.geometries)				{					var instanceMaterial:DaeInstanceMaterial = geom.materials.length ? geom.materials[0] : null;										if(_geometries[ geom.url ] is Lines3D)					{						instance.addChild(_geometries[ geom.url ]);						continue;					}										var geometry:GeometryObject3D = _geometries[ geom.url ];							if(!geometry)						continue;										if(instanceMaterial)						material = this.materials.getMaterialByName(instanceMaterial.symbol);										// register shaded materials with its object					if(material is AbstractLightShadeMaterial || material is ShadedMaterial)					{

⌨️ 快捷键说明

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