Hi everyone, I’m new to three.js and I have this problem. I’m using the code below to apply a texture to an .obj object. On object 1 downloaded from the web by a friend of mine and exported from 3d studio max the texture is applied correctly. On object 2, purchased by him on the web and exported again with 3d studio max, there are these glitches. Can anyone help me and explain why? I imagine that the problem is with the object and its export but I don’t know 3d studio max and he doesn’t know three.js
function applyTextureToObjects(idelement, materialUrl, targetObjectNames = []) {
var obj_material_size = parseFloat(jQuery("#" + idelement).attr("data-material-size"));
var roughness = parseFloat(jQuery("#" + idelement).attr("data-material-roughness"));
var metalness = parseFloat(jQuery("#" + idelement).attr("data-material-metalness"));
// Carica la texture
var textureLoader = new THREE.TextureLoader();
if(typeof materialUrl === "undefined"){
materialUrl = main_material;
obj_material_size = main_size;
roughness = main_roughness;
metalness = main_metalness;
}
textureLoader.load(materialUrl, function (texture) {
texture.offset.y += 1;
texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set(obj_material_size, obj_material_size);
// Funzione per applicare la texture a un oggetto di tipo Mesh
function applyTexture(targetObject) {
if (targetObject instanceof THREE.Mesh) {
var material = new THREE.MeshStandardMaterial({
map: texture, // La texture applicata
side: THREE.DoubleSide, // Renderizza entrambi i lati del materiale
roughness: roughness, // Valore massimo per un aspetto opaco
metalness: metalness, // Valore minimo per evitare riflettività metallica
});
targetObject.material = material;
targetObject.receiveShadow = true;
targetObject.castShadow = true;
targetObject.material.needsUpdate = true; // Aggiorna il materiale per riflettere il cambiamento
}
}
// Funzione ricorsiva per applicare la texture a tutti i Mesh in un gruppo
function applyTextureToGroup(group) {
group.traverse(function (child) {
applyTexture(child);
});
}
// Se targetObjectNames è un array vuoto, applica la texture a tutti i Mesh e Group nella scena
if (Array.isArray(targetObjectNames) && targetObjectNames.length === 0) {
scene.traverse(function (object) {
if (object instanceof THREE["Mesh"]) {
applyTexture(object);
}
else if (object instanceof THREE["Group"]) {
applyTextureToGroup(object);
}
});
}
else {
// Se è una stringa o un array con nomi specificati
var names = Array.isArray(targetObjectNames) ? targetObjectNames : [targetObjectNames];
names.forEach(function (name) {
var targetObject = scene.getObjectByName(name);
if (targetObject) {
// Se l'oggetto target è trovato e è di tipo Group, applica la texture a tutti i Mesh nel gruppo
if (targetObject instanceof THREE.Group) {
applyTextureToGroup(targetObject);
} else {
// Se l'oggetto target non è un Group, applica la texture direttamente
applyTexture(targetObject);
}
}
});
}
});
}