0

Working with Three.js r113, I'm creating walls from coordinates of a blueprint dynamically as custom geometries. I've set up the vertices, faces and faceVertexUvs already successfully. Now I'd like to wrap these geometries with a textured material, that repeats the texture and keeps the original aspect ratio. Since the walls have different lengths, I was wondering which is the best approach to do this?

What I've tried so far is loading the texture once and then using different texture.repeat values, depending on the wall length:

let textures = function() {
  let wall_brick = new THREE.TextureLoader().load('../textures/light_brick.jpg');
  return {wall_brick};
}();

function makeTextureMaterial(texture, length, height) { 
  const scale = 2;
  texture.wrapS = THREE.RepeatWrapping;
  texture.wrapT = THREE.RepeatWrapping;
  texture.repeat.set( length * scale, height * scale );
  return new THREE.MeshStandardMaterial({map: texture});
}

I then call the above function, after creating the geometry and assign the returned materials to the material array to apply it to faces of front and back of each wall. Note: material.wall is an untextured MeshStandardMaterial for the other faces.

let scaledMaterial = [
  makeTextureMaterial(textures.wall_brick, this.length.back, this.height),
  makeTextureMaterial(textures.wall_brick, this.length.front, this.height),
  material.wall
];

this.geometry.faces[0].materialIndex = 0; // back
this.geometry.faces[1].materialIndex = 0; // back
this.geometry.faces[2].materialIndex = 1; // front
this.geometry.faces[3].materialIndex = 1; // front
this.geometry.faces[4].materialIndex = 2;
this.geometry.faces[5].materialIndex = 2;
this.geometry.faces[6].materialIndex = 2;
this.geometry.faces[7].materialIndex = 2;
this.geometry.faces[8].materialIndex = 2;
this.geometry.faces[9].materialIndex = 2;
this.geometry.faces[10].materialIndex = 2;
this.geometry.faces[11].materialIndex = 2; // will do those with a loop later on :)

this.mesh = new THREE.Mesh(this.geometry, scaledMaterial);

What happens is that the texture is displayed on the desired faces, but it's not scaled individually by this.length.back and this.length.front

Any ideas how to do this? Thank you.

Patrick
  • 458
  • 6
  • 12

1 Answers1

0

I have just found the proper approach to this. The individual scaling is done via faceVertexUvs, as West Langley answered here: https://stackoverflow.com/a/27098476/4355114

Patrick
  • 458
  • 6
  • 12