Hi, I try to build a warehouse model, now I focus on placing regals in the right position. I want 6 regals on x axis, 5 on z-axis and 4 on y-axis. I use for loop to add InstancedMesh regals. Unfortunately it doesn’t work properly, my warehouse looks like this:
Most of regals are missing. I think it has something to do with how matrix is updated (dummy.matrixUpdate()
)
My code below. What’s wrong with for loop?
I attached my .glb model here.
// DRACOLoader
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath('dracoDecoder/');
// GLTFLoader
const modelLoader = new GLTFLoader();
modelLoader.setDRACOLoader(dracoLoader);
let dummy = new THREE.Object3D();
modelLoader.load(
"regalFrontBottomNoMaterials.glb", (gltf) => {
const regal = gltf.scene.getObjectByName('regalMesh');
const meshes = [];
regal.traverse(function (mesh, index) {
if (mesh.geometry != undefined && mesh.geometry != null) {
meshes.push(mesh);
}
});
if (regal.name.includes('regalMesh') || (regal.userData.InstancedObjects != undefined && regal.userData.InstancedObjects != null)) {
var materials = [];
var geometries = [];
var mergedGeometry = new THREE.BufferGeometry();
var meshMaterial;
var mergedMesh;
meshes.forEach(function (mesh, index) {
mesh.updateMatrix();
var geo = mesh.geometry.clone().applyMatrix4(mesh.matrix);
geometries.push(geo);
meshMaterial = mesh.material.clone();
materials.push(meshMaterial);
});
try {
mergedGeometry = mergeBufferGeometries(geometries, true);
mergedGeometry.groupsNeedUpdate = true;
} catch (e) {
console.log(regal.name)
}
mergedMesh = new THREE.Mesh(mergedGeometry, materials);
mergedMesh.geometry.center()
var instanceMesh1 = new THREE.InstancedMesh(mergedMesh.geometry, mergedMesh.material, 6)
var instanceMesh2 = new THREE.InstancedMesh(mergedMesh.geometry, mergedMesh.material, 5)
var instanceMesh3 = new THREE.InstancedMesh(mergedMesh.geometry, mergedMesh.material, 4)
// add meshes through for...loop
for (let i = 0; i < 6; i++) {
for (let k = 1; k <= 5; k++) {
for (let j = 1; j <= 4; j++) {
dummy.position.set(1, i*2, 1);
dummy.updateMatrix();
instanceMesh3.setMatrixAt(j, dummy.matrix);
}
dummy.position.set(1, 1, i*3);
dummy.updateMatrix();
instanceMesh2.setMatrixAt(k, dummy.matrix);
}
dummy.position.set(i*3, 1, 1);
dummy.updateMatrix();
instanceMesh1.setMatrixAt(i, dummy.matrix);
}
scene.add(instanceMesh1)
scene.add(instanceMesh2)
scene.add(instanceMesh3)
}
console.log(mergedMesh)
},
function (xhr) {
console.log((xhr.loaded / xhr.total) * 100 + "% loaded");
},
function (error) {
console.log(error);
}
);
},
regalFrontBottomNoMaterials.glb (327.3 KB)