如何在jsc3d中使用多个纹理将纹理指定给OBJ文件

如何在jsc3d中使用多个纹理将纹理指定给OBJ文件,3d,textures,jsc3d,3d,Textures,Jsc3d,我使用jsc3d查看器以.obj格式导入3d对象的一组部分,并定义了纹理。我希望能够为每个单独的部分分配新的纹理。 例如,我加载了我的.obj文件,其中包含10个不同的部分。所有部件都是白色的。我有3个.png格式的纹理:红色、蓝色和绿色。我想将红色纹理指定给某些部分,蓝色和绿色纹理指定给其他部分。我希望能够修改它们。怎么做 感谢您的帮助让我们从obj格式开始: 这是一个简单立方体的示例,其中3种不同的纹理应用于对面: # OBJ File Generated by Meshlab #

我使用jsc3d查看器以.obj格式导入3d对象的一组部分,并定义了纹理。我希望能够为每个单独的部分分配新的纹理。 例如,我加载了我的.obj文件,其中包含10个不同的部分。所有部件都是白色的。我有3个.png格式的纹理:红色、蓝色和绿色。我想将红色纹理指定给某些部分,蓝色和绿色纹理指定给其他部分。我希望能够修改它们。怎么做


感谢您的帮助

让我们从obj格式开始: 这是一个简单立方体的示例,其中3种不同的纹理应用于对面:

# OBJ File Generated by Meshlab    
# Vertices: 8
# Faces: 12
mtllib ./tex_cube.obj.mtl
v -50.00 -50.00 50.00
v -50.00 50.00 50.00
v 50.00 -50.00 50.00
v 50.00 50.00 50.00
v 50.00 -50.00 -50.00
v 50.00 50.00 -50.00
v -50.00 -50.00 -50.00
v -50.00 50.00 -50.00
请注意mtl文件的路径,大多数问题是因为找不到该文件,而且一些3d工具不允许mtl文件或纹理的相对路径。我建议你把它和obj文件放在一起

有12个三角形,因为立方体的每一侧都已被三角化。 vt vertex纹理标记定义纹理的贴图方式,在本例中,通过UV为每个面进行贴图:

vt 1.00 1.00
vt 0.00 1.00
vt 0.00 0.00
vt 1.00 0.00
JSC3D将读取vt标记、f faces标记和usemtl标记以构建3d对象:

usemtl material_0
f 4/1 2/2 1/3
f 3/4 4/1 1/3
f 8/1 6/2 5/3
f 7/4 8/1 5/3

usemtl material_1
f 6/1 4/2 3/3
f 5/4 6/1 3/3
f 2/1 8/2 7/3
f 1/4 2/1 7/3

usemtl material_2
f 6/1 8/2 2/3
f 4/4 6/1 2/3
f 3/1 1/2 7/3
f 5/4 3/1 7/3
材质将重新映射到mtl文件中相应的png文件:

newmtl material_0
Ka 0.200000 0.200000 0.200000
Kd 1.000000 1.000000 1.000000
Ks 1.000000 1.000000 1.000000
map_Kd red_tex.png
。。。其他两种纹理,绿色和蓝色,依此类推

此文件是从MeshLab中的以下导出设置获得的,只是为了指出您不需要导出法线,JSC3D将动态地重新创建它们:

很抱歉对obj测试文件进行了枯燥的解释

如果在JSC3D查看器中加载此多维数据集并检查viewer.scene.children[],您将发现3个网格,因为JSC3D已将多维数据集的12个三角形分组为3个单独的部分,每个部分对应于在obj文件中找到的usemtl标记

现在,您可以通过PickInfo结构通过鼠标单击、触摸或代码选择查看器中的一个面来获取其中一个部分的引用

例如,如果需要将蓝色纹理替换为其他纹理:

function replaceBlueTexture() {
    objParts = []; // you can also replace more than one part
    objParts[0] = viewer.scene.children[2];
    objLoader.setupTexture(objParts, "models/obj/aluminum.png");
}
结果如下所示:加载后左右,纹理更改后左右:

现在,这个立方体的顶面和底面是铝纹理的

编辑:

replaceBlueTexture函数假定您已经知道应该替换哪个网格

如果必须用网格的名称替换网格的材质或纹理,该怎么办

首先加载并解析obj文件,然后加载mtl文件,但在解析obj文件期间,jsc3d已将材质名称捕获并存储在网格对象中

如果查看viewer.scene对象,您将看到上述网格以及关联的材质和纹理:

viewer.setParameter('RenderMode', 'texturesmooth');
您只需检查mesh.mtl或mesh.material.name即可-其中一个应填写在最新版本的jsc3d中:

function replaceBlueTextureByName() {
    var scene = viewer.getScene();
    var meshes = scene.getChildren();
    for (var i=0, l=meshes.length; i<l; i++) {
        var mesh = meshes[i];
        var mat = mesh.material;
        if (mat.name == 'mat_blue_tex') {
            var objParts = [];
            objParts[0] = mesh;
            loader.setupTexture(objParts, "models/obj/aluminum.png");
        }
    }
}

伟大的我真的很感谢你的帮助。但我需要更多的解释。关于mtl文件,如果我在里面的话:newmtl BASIC_FABRIC_FRONT_15517 Ka 0.694256 0.694256 Kd 0.748897 0.748897 Ks 0.000000 0.000000 0.000000 Ns 5.000000 illum 2 d 1.000000 newmtl Material15532 Ka 0.847059 0.847059 Kd 0.913725 0.913725 Ks 0.000000 0.000000 Ns 5.000000 illum 2 d 1.000000。如何按名称选择材质(比如newmtl Material15532)并在其上应用纹理???Hi Al vlad,澄清问题:您的mtl文件中只定义了材质,而没有纹理,因为纹理是图像文件,例如映射到材质的png或jpg。请参阅我的编辑。