瀏覽代碼

Merge pull request #4714 from kcoley/glTFSerializerFixWindingOrder

glTFSerializer: Fix for handling negative scale
David Catuhe 7 年之前
父節點
當前提交
f15c11344d
共有 1 個文件被更改,包括 27 次插入0 次删除
  1. 27 0
      serializers/src/glTF/2.0/babylon.glTFExporter.ts

+ 27 - 0
serializers/src/glTF/2.0/babylon.glTFExporter.ts

@@ -1168,6 +1168,18 @@ module BABYLON.GLTF2 {
             });
         }
 
+        private getRootNodes(babylonScene: Scene, nodes: TransformNode[], shouldExportTransformNode: (babylonTransformNode: TransformNode) => boolean): TransformNode[] {
+            const rootNodes: TransformNode[] = [];
+            for (let babylonTransformNode of nodes) {
+                if (shouldExportTransformNode(babylonTransformNode)) {
+                    if (babylonTransformNode.parent == null) {
+                        rootNodes.push(babylonTransformNode);
+                    }
+                }
+            }
+            return rootNodes;
+        }
+
         /**
          * Creates a mapping of Node unique id to node index and handles animations
          * @param babylonScene Babylon Scene
@@ -1187,9 +1199,24 @@ module BABYLON.GLTF2 {
             let idleGLTFAnimations: IAnimation[] = [];
             let node: INode;
 
+            let negScaleRootNode: Nullable<TransformNode> = null;
+
+            const rootNodes = this.getRootNodes(babylonScene, nodes, shouldExportTransformNode);
+            if (rootNodes.length === 1) {
+                const node = rootNodes[0];
+                if (node.scaling.equalsToFloats(1,1, -1)) {
+                    this._convertToRightHandedSystem = !this._convertToRightHandedSystem;
+                    negScaleRootNode = node;
+                }  
+            }
+
             for (let babylonTransformNode of nodes) {
                 if (shouldExportTransformNode(babylonTransformNode)) {
                     node = this.createNode(babylonTransformNode, binaryWriter);
+                    if (negScaleRootNode && babylonTransformNode === negScaleRootNode) {
+                        node.scale = [1,1,1];
+                        node.rotation = [0,0,0,1];
+                    }
 
                     this._nodes.push(node);
                     nodeIndex = this._nodes.length - 1;