Reputation: 43933
In three.js I want to create a road. I have this
var width = 5;
var length = 4;
var height = 1;
var geometry = new THREE.BoxGeometry( width, length, height );
var textureloader = new THREE.TextureLoader();
var texture = textureloader.load('images/tile_brick.png', function(tx) {
var material = new THREE.MeshBasicMaterial({
map: tx,
wireframe: false
});
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );
});
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set( width, length );
and it ends up looking like this
It repeats on x axis 5 times which is good, it repeats 4 times on y axis which is good, but for z axis it is also repeating 4 times which is bad because it is getting compressed, I want it to repeat 1 times there.
Does anyone know how to fix it?
Thanks
Upvotes: 2
Views: 964
Reputation: 211249
The 2 dimensional texture has to be wrapped on the 3 dimensional box object. The repeat factor for the texture wrapping depends on the dimension of the cuboids side.
You've to create 3 texture objects, for the 3 different pairs of sides:
var width = 5, length = 4, height = 1;
var textureloader = new THREE.TextureLoader();
var texture1 = new THREE.TextureLoader().load('images/tile_brick.png');
texture1.wrapS = THREE.RepeatWrapping;
texture1.wrapT = THREE.RepeatWrapping;
texture1.repeat.set( width, length );
var material1 = new THREE.MeshBasicMaterial( { map: texture1 } );
var texture2 = new THREE.TextureLoader().load('images/tile_brick.png');
texture2.wrapS = THREE.RepeatWrapping;
texture2.wrapT = THREE.RepeatWrapping;
texture2.repeat.set( width, height );
var material2 = new THREE.MeshBasicMaterial( { map: texture2 } );
var texture3 = new THREE.TextureLoader().load('images/tile_brick.png');
texture3.wrapS = THREE.RepeatWrapping;
texture3.wrapT = THREE.RepeatWrapping;
texture3.repeat.set( height, length );
var material3 = new THREE.MeshBasicMaterial( { map: texture3 } );
var geometry = new THREE.BoxGeometry( width, length, height );
var mesh = new THREE.Mesh(geometry, [material3, material3, material2, material2, material1, material1]);
scene.add(mesh);
Example:
(function onLoad() {
var camera, scene, renderer, orbitControls;
init();
animate();
function init() {
renderer = new THREE.WebGLRenderer({
antialias: true,
alpha: false
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
document.body.appendChild(renderer.domElement);
camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
camera.position.set(0, -4, 4);
camera.lookAt( 0, 0, 0 );
loader = new THREE.TextureLoader();
loader.setCrossOrigin("");
scene = new THREE.Scene();
scene.background = new THREE.Color(0x7f7f7f);
scene.add(camera);
window.onresize = function() {
renderer.setSize(window.innerWidth, window.innerHeight);
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
}
orbitControls = new THREE.OrbitControls(camera, document.body);
createModel();
}
function createModel() {
var width = 5, length = 4, height = 1;
var textureloader = new THREE.TextureLoader();
var texture1 = new THREE.TextureLoader().load("https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/brickwall.png");
texture1.wrapS = THREE.RepeatWrapping;
texture1.wrapT = THREE.RepeatWrapping;
texture1.repeat.set( width, length );
var material1 = new THREE.MeshBasicMaterial( { map: texture1 } );
var texture2 = new THREE.TextureLoader().load("https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/brickwall.png");
texture2.wrapS = THREE.RepeatWrapping;
texture2.wrapT = THREE.RepeatWrapping;
texture2.repeat.set( width, height );
var material2 = new THREE.MeshBasicMaterial( { map: texture2 } );
var texture3 = new THREE.TextureLoader().load("https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/brickwall.png");
texture3.wrapS = THREE.RepeatWrapping;
texture3.wrapT = THREE.RepeatWrapping;
texture3.repeat.set( height, length );
var material3 = new THREE.MeshBasicMaterial( { map: texture3 } );
var geometry = new THREE.BoxGeometry( width, length, height );
var mesh = new THREE.Mesh(geometry, [material3, material3, material2, material2, material1, material1]);
scene.add(mesh);
}
function animate() {
requestAnimationFrame(animate);
orbitControls.update();
render();
}
function render() {
renderer.render(scene, camera);
material.map = texture1;
}
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
Upvotes: 2