📄 dae.as
字号:
var matrix:Matrix3D = Matrix3D.IDENTITY; for( var i:int = 0; i < node.transforms.length; i++ ) { var transform:DaeTransform = node.transforms[i]; matrix = Matrix3D.multiply( matrix, new Matrix3D(transform.matrix) ); } return matrix; } /** * * @param node * @return */ private function buildMatrixStack( node:DaeNode ):Array { var stack:Array = new Array(); for( var i:int = 0; i < node.transforms.length; i++ ) { var transform:DaeTransform = node.transforms[i]; var matrix:Matrix3D = new Matrix3D(transform.matrix); stack.push(matrix); } return stack; } /** * * @param instance_controller * @param instance * @return */ private function buildMorph( instance_controller:DaeInstanceController, instance:AnimatedMesh3D ):void { var controller:DaeController = document.controllers[instance_controller.url]; var morph:DaeMorph = controller.morph; var success:Boolean = buildGeometry(morph.source, instance); if( !success ) { Logger.error("[ERROR] could not find geometry for morph!"); throw new Error("could not find geometry for morph!"); } var ctl:MorphController = new MorphController(instance.geometry); var target0:DisplayObject3D = new DisplayObject3D(); buildGeometry(morph.source, target0); var frame:uint = 0; var duration:uint = AnimationEngine.NUM_FRAMES / morph.targets.length; // use a copy of the original vertices! ctl.addFrame(new AnimationFrame(frame, duration, target0.geometry.vertices, "start")); frame += duration; for( var i:int = 0; i < morph.targets.length; i++ ) { var obj:DisplayObject3D = new DisplayObject3D(); var target:String = morph.targets[i]; var weight:Number = morph.weights[i]; buildGeometry(target, obj); ctl.addFrame(new AnimationFrame(frame, duration, obj.geometry.vertices, target)); frame += duration; } instance.addController(ctl); _morphs[ instance ] = true; } /** * * @param node * @return */ private function buildNode( node:DaeNode, parent:DisplayObject3D ):void { var instance_controller :DaeInstanceController = findSkinController(node); var instance_ctl_morph :DaeInstanceController = findMorphController(node); var newNode:DisplayObject3D; var instance:DisplayObject3D; var material:MaterialObject3D; if( instance_controller ) { buildMaterialInstances(instance_controller.materials); newNode = buildSkin(instance_controller, material); if( newNode ) { flipFaceNormals(newNode.geometry); instance = parent.addChild(newNode); } } else if( instance_ctl_morph ) { buildMaterialInstances(instance_ctl_morph.materials); newNode = new AnimatedMesh3D(material, new Array(), new Array(), node.id); buildMorph(instance_ctl_morph, newNode as AnimatedMesh3D); flipFaceNormals(newNode.geometry); instance = parent.addChild(newNode); } else if( node.geometries.length ) { newNode = new Node3D(node.name, node.id, node.sid); for each( var geomInst:DaeInstanceGeometry in node.geometries ) { material = buildMaterialInstances(geomInst.materials); buildGeometry(geomInst.url, newNode, material); } if(newNode.geometry && newNode.geometry.vertices && newNode.geometry.faces) { newNode.geometry.ready = true; flipFaceNormals(newNode.geometry); } instance = parent.addChild(newNode); Node3D(instance).matrixStack = buildMatrixStack(node); Node3D(instance).transforms = node.transforms; } else { instance = parent.addChild(new Node3D(node.name, node.id, node.sid)); Node3D(instance).matrixStack = buildMatrixStack(node); Node3D(instance).transforms = node.transforms; } for( var j:int = 0; j < node.instance_nodes.length; j++ ) { var instance_node:DaeInstanceNode = node.instance_nodes[j]; var dae_node:DaeNode = document.getDaeNodeById(instance_node.url); buildNode(dae_node, instance); } for( var i:int = 0; i < node.nodes.length; i++ ) buildNode(node.nodes[i], instance); var matrix:Matrix3D = buildMatrix(node); instance.copyTransform( matrix ); } /** * * @param event * @return */ private function buildScene( event:Event ):void { if( _reader.hasEventListener(Event.COMPLETE) ) _reader.removeEventListener(Event.COMPLETE, buildScene); this.document = _reader.document; _yUp = (this.document.asset.yUp == ASCollada.DAE_Y_UP); _materialInstances = new Object(); _materialTextureSets = new Object(); _skins = new Dictionary(); _morphs = new Dictionary(); this.skins = new Array(); buildMaterials(); buildVisualScene(); linkSkins(this._rootNode); //if( !_loadScaleSet ) // this.scale = DEFAULT_SCALE; // there may be animations left to parse... if( document.numQueuedAnimations ) { hasAnimations = true; _reader.addEventListener( Event.COMPLETE, animationCompleteHandler ); _reader.addEventListener( ProgressEvent.PROGRESS, animationProgressHandler ); _reader.readAnimations(); } else { hasAnimations = false; // done with geometry dispatchEvent(new Event(Event.COMPLETE)); } } /** * * @param instance_controller * @return */ private function buildSkin( instance_controller:DaeInstanceController, material:MaterialObject3D = null ):TriangleMesh3D { var controller:DaeController = document.controllers[ instance_controller.url ]; if( !controller || !controller.skin ) { Logger.trace( "[WARNING] no skin controller!" ); return null; } var skin:DaeSkin = controller.skin; var obj:Skin3D = new Skin3D(material, new Array(), new Array(), skin.source, (document.yUp == DaeDocument.Y_UP)); obj.bindPose = new Matrix3D(skin.bind_shape_matrix); obj.joints = new Array(); var success:Boolean = buildGeometry(skin.source, obj); // geometry could reside in a morph controller if( !success && document.controllers[skin.source] ) { var morph_controller:DaeController = document.controllers[skin.source]; if( morph_controller.morph ) { success = buildGeometry(morph_controller.morph.source, obj); if( success ) { var ctl:MorphController = new MorphController(obj.geometry); var method:String = morph_controller.morph.method; var duration:int = AnimationEngine.NUM_FRAMES / morph_controller.morph.targets.length; var frame:uint = 0; for( var i:int = 0; i < morph_controller.morph.targets.length; i++ ) { var morph:DisplayObject3D = new DisplayObject3D(); var target:String = morph_controller.morph.targets[i]; var weight:Number = morph_controller.morph.weights[i]; var morph_succes:Boolean = buildGeometry(target, morph); if( morph_succes ) { ctl.addFrame(new AnimationFrame(frame, duration, morph.geometry.vertices, target)); frame += duration; //obj.morph_targets.push( morph.geometry ); //obj.morph_weights.push( weight ); } } obj.addController(ctl); } } } if( !success ) { Logger.error( "[ERROR] could not find geometry for skin!" ); throw new Error( "could not find geometry for skin!" ); } obj.geometry.ready = true; _skins[ obj ] = instance_controller; this.skins.push(obj); return obj; } /** * * @param spline * @return */ private function buildSpline( spline:DaeSpline ):DisplayObject3D { var lines:Lines3D = new Lines3D(new LineMaterial(0xffff00, 0.5)); for( var i:int = 0; i < spline.vertices.length; i++ ) { var v0:Array = spline.vertices[i]; var v1:Array = spline.vertices[(i+1) % spline.vertices.length]; lines.addNewLine(0, v0[0], v0[1], v0[2], v1[0], v1[1], v1[2]); } return lines; } /** * * @param mesh * @return */ private function buildVertices( mesh:DaeMesh ):Array { var vertices:Array = new Array(); for( var i:int = 0; i < mesh.vertices.length; i++ ) { var v:Array = mesh.vertices[i]; vertices.push(new Vertex3D(v[0], v[1], v[2])); } return vertices; } /** * Builds the visual scene (scenegraph). */ private function buildVisualScene():void { this._rootNode = addChild(new DisplayObject3D("COLLADA_root")); for( var i:int = 0; i < document.vscene.nodes.length; i++ ) buildNode(document.vscene.nodes[i], this._rootNode); if(this._yUp) { } else { this._rootNode.rotationX = 90; this._rootNode.rotationY = 180; } this._rootNode.scaleX = -1; } /** * Clones the source and append the clone to target. Then recurse... * * @param target * @param source */ private function cloneObj( target:DisplayObject3D, source:DisplayObject3D ):void { var o:DisplayObject3D; if( source === _rootNode ) { o = new DisplayObject3D(source.name); o.copyTransform( source.transform ); target = target.addChild(o); } else if( source is Skin3D ) { o = Skin3D(source).clone(); o.copyTransform( source.transform ); o.geometry.ready = true; target = target.addChild(o); } else if( source is Node3D ) { var n:Node3D = source as Node3D; o = n.clone(); o.copyTransform(n.transform); o.geometry = cloneGeometry(o, source.geometry); o.geometry.ready = true; target = target.addChild(o); } else if( source is TriangleMesh3D ) { o = new TriangleMesh3D(source.material, new Array(), new Array(), source.name); o.copyTransform( source.transform ); o.geometry = cloneGeometry(o, source.geometry); o.geometry.ready = true; target = target.addChild(o); } else if( source is DisplayObject3D ) { o = new DisplayObject3D(source.name); o.copyTransform(source.transform); target = target.addChild(o); } for each( var child:DisplayObject3D in source.children ) { cloneObj(target, child); } } /** * Clones a GeometryObject3D an sets up the faces for target. * * @param target The target for the cloned faces and vertices. * @param source The source GeometryObject3D. * * @return GeometryObject3D */ private function cloneGeometry( target:DisplayObject3D, source:GeometryObject3D ):GeometryObject3D { var geom:GeometryObject3D = new GeometryObject3D(); var vertices:Array = source.vertices; var faces:Array = source.faces; var i:int; var newVerts:Dictionary = new Dictionary(); geom.vertices = new Array(); geom.faces = new Array(); for( i = 0; i < vertices.length; i++ ) { var v:Vertex3D = vertices[i]; newVerts[ v ] = v.clone(); geom.vertices.push( newVerts[ v ] ); } for( i = 0; i < faces.length; i++ ) { var f:Triangle3D = faces[i]; var v0:Vertex3D = newVerts[ f.v0 ]; var v1:Vertex3D = newVerts[ f.v1 ]; var v2:Vertex3D = newVerts[ f.v2 ]; var uv0:NumberUV = f.uv[0].clone(); var uv1:NumberUV = f.uv[1].clone(); var uv2:NumberUV = f.uv[2].clone(); var newTri:Triangle3D = new Triangle3D(target, [v0, v1, v2], f.material, [uv0, uv1, uv2]); geom.faces.push( newTri ); } return geom;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -