2012-07-06 8 views

Respuesta

1

Primero vería el convertidor python OBJ -> three.js.

Al margen de eso, no creo que vaya a encontrar ninguna biblioteca preconstruida para hacer esto. Realmente le preguntaría a 3DTin si usaron una biblioteca o si la desarrollaron internamente.

3

Escribir un OBJExporter debería ser bastante fácil. Solo use como referencia el OBJLoader. En algunas semanas probablemente lo escriba yo mismo si nadie lo ha hecho para entonces.

+0

Gracias! Creo que será extremadamente útil. – user1507511

7

Para obtener malla en formato .obj utilizo esta función simple:

THREE.saveGeometryToObj = function (geometry) { 
var s = ''; 
for (i = 0; i < geometry.vertices.length; i++) { 
    s+= 'v '+(geometry.vertices[i].x) + ' ' + 
    geometry.vertices[i].y + ' '+ 
    geometry.vertices[i].z + '\n'; 
} 

for (i = 0; i < geometry.faces.length; i++) { 

    s+= 'f '+ (geometry.faces[i].a+1) + ' ' + 
    (geometry.faces[i].b+1) + ' '+ 
    (geometry.faces[i].c+1); 

    if (geometry.faces[i].d !== undefined) { 
     s+= ' '+ (geometry.faces[i].d+1); 
    } 
    s+= '\n'; 
} 

return s; 
} 
+0

¿Tiene un objeto de geometría de ejemplo funcional que funcione con esto? Estaba obteniendo 'longitud indefinida' pero estoy tratando de guardar una malla de buffer de triple plano, ¿entonces quizás el formato del objeto es diferente? –

0

pellizqué el código anterior ligeramente para permitir que para las matrices de objetos que se han duplicado y traducidos en torno a una escena. Actualmente estoy utilizando document.writeln y luego copio y pegue manualmente en un documento.

var l = parent.length; 
var j = 0; 

while (l--) { 

var numVerts = parent[l].children[0].geometry.vertices.length; 
document.writeln(THREE.saveGeometryToObj(parent[l].children[0],j*(numVerts)));  

j++; 
} 

THREE.saveGeometryToObj = function (geo,nums) { 

geo.updateMatrixWorld(); 
var num = parseInt(nums); 
var s = ''; 

for (i = 0; i < geo.geometry.vertices.length; i++) { 

    var vector = new THREE.Vector3(geo.geometry.vertices[i].x, geo.geometry.vertices[i].y, geo.geometry.vertices[i].z); 
    geo.matrixWorld.multiplyVector3(vector); 


    s+= 'v '+(vector.x) + ' ' + 
    vector.y + ' '+ 
    vector.z + '</br>'; 
} 

for (i = 0; i < geo.geometry.faces.length; i++) { 

    s+= 'f '+ (geo.geometry.faces[i].a+1+num) + ' ' + 
    (geo.geometry.faces[i].b+1+num) + ' '+ 
    (geo.geometry.faces[i].c+1+num); 

    if (geo.geometry.faces[i].d!==undefined) { 
     s+= ' '+ (geo.geometry.faces[i].d+1+num); 
    } 
    s+= '</br>'; 
} 

return s; 

}