2016-05-06 7 views
0

Jedes Mal, wenn ich das Modell (SkinnedMesh) aus meiner Three.js-Szene exportiert und speichere, wird das ursprüngliche importierte Modell gespeichert. Dies passiert, obwohl ich das Modell modifiziere, indem ich einen Bone rotiere und den Wert eines Morph-Ziels ändere.Wie exportiere ich Geometrie aus einer Three.js-Szene als OBJ, die geändert wurde?

Ich habe im Konsolenfenster nach Änderungen an den Geometriedaten gesucht, und es wird angezeigt, dass die Bone- und Morph-Zielinformationen aktualisiert wurden. Aber aus irgendeinem Grund, wenn ich exportieren und speichern, wird das aktualisierte Modell nicht gespeichert.

Hier ist meine render() -Funktion, wo das Modell exportiert und als OBJ gespeichert wird.

function render() { 

    cube.rotation.x += guiControls.rotationX; 
    cube.rotation.y += guiControls.rotationY; 
    cube.rotation.z += guiControls.rotationZ; 

    spotLight.position.x = guiControls.lightX; 
    spotLight.position.y = guiControls.lightY; 
    spotLight.position.z = guiControls.lightZ; 

    camera.lookAt(lookAtPos); 

     scene.traverse(function(child){ 
     if (child instanceof THREE.SkinnedMesh){ 

      child.skeleton.bones[13].rotation.y = guiControls.Shoulder; 
      child.scale.x = guiControls.ScaleX; 
      child.scale.y = guiControls.ScaleY; 
      child.scale.z = guiControls.ScaleZ; 
      child.position.x = guiControls.PositionX; 
      child.position.y = guiControls.PositionY; 
      child.position.z = guiControls.PositionZ; 

      child.geometry.dynamic = true; 
      child.geometry.verticesNeedUpdate = true; 
      child.geometry.elementsNeedUpdate = true; 
      child.updateProjectionMatrix = true; 

      if(save){ 
       var exporter = new THREE.OBJExporter(); 
       var result = exporter.parse(child); 

       var saveData = (function() { 
       var a = document.createElement("a"); 
       document.body.appendChild(a); 
       a.style = "display: none"; 
       return function (data, fileName) { 
         var obj = data, 
         blob = new Blob([obj], {type: "octet/stream"}), 
         url = window.URL.createObjectURL(blob); 
        a.href = url; 
        a.download = fileName; 
        a.click(); 
        window.URL.revokeObjectURL(url); 
       }; 
       }()); 

       saveData(result, "ModelOBJExport.obj"); 

       save = false; 
      } 

     } 
     else if (child instanceof THREE.SkeletonHelper){ 
      child.update(); 
     } 
    }); 

} 

Hier ist ein JSFiddle all meinen Code enthält - https://jsfiddle.net/markskelton/ord9gL1a/. Ich war mir nicht sicher, wie ich mein Modell hochladen sollte, damit die Leute es mit meinem Code verwenden können.

Antwort

0

Ich weiß nicht, ob einige davon in Ihrem Fall redundant ist Aber das ist in meinem Speicherprozess. Nach dem Einstellen der Größe, Position und Drehung, versuchen:

Aus irgendeinem Grund funktioniert dies nicht für Menschen. Ich füge die Funktion hinzu, die ich in ihrer Gesamtheit laufe, Kommentare und alles. Ich kann nicht sagen, warum andere Leute das nicht zur Arbeit bringen können. Das funktioniert gut für mich. Ich würde vorschlagen, wenn Leute Probleme haben, das Code- und Beispielproblem in einer neuen Frage zu zeigen.

objSaver.prototype.modifyMeshToRhinoObj = function (mesh) { 
     var exporter = new THREE.OBJExporter(); 
     //we do no save the original extrusion geometry. We clone it, match it's axis and scale to external settings, usually found in Rhino (non adjusted obj up), and save the clone. 
     //This is so on re-import it is treated as if it came from any mesh tool. 
     var polygonGeometry = new THREE.Geometry().fromBufferGeometry(mesh.geometry._bufferGeometry); 
     var volumeClone = new THREE.Mesh(polygonGeometry, [ 
       new THREE.MeshBasicMaterial({ color: 16711680 }), 
       new THREE.MeshBasicMaterial({ color: 16711680 }) 
     ]); 
     volumeClone.scale.set(1, 1, mesh.scale.z); 
     volumeClone.rotation.x = de2ra(180); 
     volumeClone.rotation.z = de2ra(-90); 
     volumeClone.updateMatrix(); 
     volumeClone.geometry.applyMatrix(volumeClone.matrix); 
     volumeClone.matrixAutoUpdate = true; 
     volumeClone.matrix.identity(); 
     volumeClone.geometry.verticesNeedUpdate = true; 
     mesh.userData.cloned = true; 
     mesh.userData.baseline = mesh.userData.buildingHeight; 
     return exporter.parse(volumeClone); 
}; 
+0

Hey, danke für die Antwort! Scheint immer noch das Originalmodell zu exportieren. Würde Ihre Antwort für die neueste Version von Three.js gelten? – skelto

+0

Ich habe auch einen Vergleichsvergleich für zwei OBJ-Dateien durchgeführt, die ich aus meiner Szene exportiert und gespeichert habe, eine mit dem Modell in der ursprünglichen Position und die andere mit einem geänderten Morph-Ziel. Beide OBJ-Dateien sind genau gleich. – skelto

+0

Wurde dies gelöst? –

Verwandte Themen