gpt4 book ai didi

3d - 将三个 js 纹理模型导出为带有 .MTL 文件的 .OBJ

转载 作者:行者123 更新时间:2023-12-03 20:04:26 26 4
gpt4 key购买 nike

我希望能够像本例中一样导出 obj 文件 http://threejs.org/examples/#webgl_exporter_obj

但是,我想在 .mtl 纹理文件中导出带有相应纹理的 .obj 文件(我见过带有“usemtl someTextureNameFromMTL”的 obj 文件)

我见过this question但导出商似乎只导出网格。我也找到了this question但这仅讨论进口商。

我想要实现的是制作一个 3d 可打印编辑器,它也可以导出纹理/颜色,因为已经有一个用于 3d 打印的 .STL 网格导出器。但是,我没有发现三个 js 的网格+颜色/纹理导出器:(

最佳答案

我稍微扩展了 OBJExporter。它将返回一个包含 .obj 部分和 .mtl 部分的对象。我只是在没有测试的情况下写下来,所以可能存在错误,但我希望它是一个开始。

我没有查找所有的 mtl 值,我只是使用了一些除了颜色和纹理信息之外的标准值。也许以后我会改进它。您还需要了解 mtl 文件名。目前,我正在为 obj 部分写一个静态名称。保存文件时,mtl 文件需要与声明的 obj 文件同名。否则 3ds max 等不会读取它。

/**
* @author mrdoob / http://mrdoob.com/
*/

THREE.OBJExporter = function () {};

THREE.OBJExporter.prototype = {

constructor: THREE.OBJExporter,

parse: function ( object ) {

var output = '';
var materials = {};

var indexVertex = 0;
var indexVertexUvs = 0;
var indexNormals = 0;

var mtlFileName = 'objmaterial'; // maybe this value can be passed as parameter
output += 'mtllib ' + mtlFileName + '.mtl\n';

var parseMesh = function ( mesh ) {

var nbVertex = 0;
var nbVertexUvs = 0;
var nbNormals = 0;

var geometry = mesh.geometry;
var material = mesh.material;

if ( geometry instanceof THREE.Geometry ) {

output += 'o ' + mesh.name + '\n';

var vertices = geometry.vertices;

for ( var i = 0, l = vertices.length; i < l; i ++ ) {

var vertex = vertices[ i ].clone();
vertex.applyMatrix4( mesh.matrixWorld );

output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';

nbVertex ++;

}

// uvs

var faces = geometry.faces;
var faceVertexUvs = geometry.faceVertexUvs[ 0 ];
var hasVertexUvs = faces.length === faceVertexUvs.length;

if ( hasVertexUvs ) {

for ( var i = 0, l = faceVertexUvs.length; i < l; i ++ ) {

var vertexUvs = faceVertexUvs[ i ];

for ( var j = 0, jl = vertexUvs.length; j < jl; j ++ ) {

var uv = vertexUvs[ j ];

output += 'vt ' + uv.x + ' ' + uv.y + '\n';

nbVertexUvs ++;

}

}

}

// normals

var normalMatrixWorld = new THREE.Matrix3();
normalMatrixWorld.getNormalMatrix( mesh.matrixWorld );

for ( var i = 0, l = faces.length; i < l; i ++ ) {

var face = faces[ i ];
var vertexNormals = face.vertexNormals;

if ( vertexNormals.length === 3 ) {

for ( var j = 0, jl = vertexNormals.length; j < jl; j ++ ) {

var normal = vertexNormals[ j ].clone();
normal.applyMatrix3( normalMatrixWorld );

output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';

nbNormals ++;

}

} else {

var normal = face.normal.clone();
normal.applyMatrix3( normalMatrixWorld );

for ( var j = 0; j < 3; j ++ ) {

output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';

nbNormals ++;

}

}

}

// material

if (material.name !== '')
output += 'usemtl ' + material.name + '\n';
else
output += 'usemtl material' + material.id + '\n';

materials[material.id] = material;

// faces


for ( var i = 0, j = 1, l = faces.length; i < l; i ++, j += 3 ) {

var face = faces[ i ];

output += 'f ';
output += ( indexVertex + face.a + 1 ) + '/' + ( hasVertexUvs ? ( indexVertexUvs + j ) : '' ) + '/' + ( indexNormals + j ) + ' ';
output += ( indexVertex + face.b + 1 ) + '/' + ( hasVertexUvs ? ( indexVertexUvs + j + 1 ) : '' ) + '/' + ( indexNormals + j + 1 ) + ' ';
output += ( indexVertex + face.c + 1 ) + '/' + ( hasVertexUvs ? ( indexVertexUvs + j + 2 ) : '' ) + '/' + ( indexNormals + j + 2 ) + '\n';

}

} else {

console.warn( 'THREE.OBJExporter.parseMesh(): geometry type unsupported', mesh );
// TODO: Support only BufferGeometry and use use setFromObject()

}

// update index
indexVertex += nbVertex;
indexVertexUvs += nbVertexUvs;
indexNormals += nbNormals;

};

object.traverse( function ( child ) {

if ( child instanceof THREE.Mesh ) parseMesh( child );

} );

// mtl output

var mtlOutput = '';

for (var key in materials) {

var mat = materials[key];

if (mat.name !== '')
mtlOutput += 'newmtl ' + mat.name + '\n';
else
mtlOutput += 'newmtl material' + mat.id + '\n';

mtlOutput += 'Ns 10.0000\n';
mtlOutput += 'Ni 1.5000\n';
mtlOutput += 'd 1.0000\n';
mtlOutput += 'Tr 0.0000\n';
mtlOutput += 'Tf 1.0000 1.0000 1.0000\n';
mtlOutput += 'illum 2\n';
mtlOutput += 'Ka ' + mat.color.r + ' ' + mat.color.g + ' ' + mat.color.b + ' ' + '\n';
mtlOutput += 'Kd ' + mat.color.r + ' ' + mat.color.g + ' ' + mat.color.b + ' ' + '\n';
mtlOutput += 'Ks 0.0000 0.0000 0.0000\n';
mtlOutput += 'Ke 0.0000 0.0000 0.0000\n';

if (mat.map && mat.map instanceof THREE.Texture) {

var file = mat.map.image.currentSrc.slice( mat.map.image.currentSrc.slice.lastIndexOf("/"), mat.map.image.currentSrc.length - 1 );

mtlOutput += 'map_Ka ' + file + '\n';
mtlOutput += 'map_Kd ' + file + '\n';

}

}

return {
obj: output,
mtl: mtlOutput
}

}

};

关于3d - 将三个 js 纹理模型导出为带有 .MTL 文件的 .OBJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35070048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com