📄 dae.as.svn-base
字号:
{ 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 + -