Повторение карты рельефа
Я пытаюсь применить рельефную карту к плоскости, чтобы создать неопределенно чувствующую поверхность, используя Three.js r55.
Вот мой код:
var mapHeight = THREE.ImageUtils.loadTexture("images/felt.png");
mapHeight.repeat.set(2, 2);
mapHeight.wrapS = mapHeight.wrapT = THREE.RepeatWrapping;
mapHeight.format = THREE.RGBFormat;
var groundMaterial = new THREE.MeshPhongMaterial({
ambient: 0x008800, color: 0x008800, specular: 0x888888,
shininess: 25, bumpMap: mapHeight, bumpScale: 10, metal: false
} );
scene.add(new THREE.Mesh(new THREE.PlaneGeometry(0.3, 0.3), groundMaterial));
Обратите внимание, как я установил повтор текстуры дважды по осям X / Y. Однако то, что я вижу, применяет текстуру только в одном квадранте:
Я ожидал бы этого с оберткой зажима / повторения (или как там это называется), но я просил RepeatWrapping
Вот.
Как сделать так, чтобы карта рельефа правильно повторялась произвольное количество раз на плоскости.
РЕДАКТИРОВАТЬ - Полный код
Я приступил к созданию простого случая воспроизведения. Это довольно минимально и воспроизводит изображение ниже (под немного другим углом камеры). Выход имеет ту же проблему.
<!DOCTYPE html>
<html>
<head>
<script src="scripts/libs/three.min.js" type="text/javascript"></script>
</head>
<body>
<div id="scene-container"></div>
<script>
init();
function init() {
var camera, scene, renderer;
scene = new THREE.Scene();
scene.add( new THREE.AmbientLight( 0x555555 ) );
var light = new THREE.DirectionalLight( 0x555555 );
light.position.set( 0, 0, 10 );
scene.add( light );
var bumpMapTexture = THREE.ImageUtils.loadTexture( "images/felt.png", undefined, function () {
requestAnimationFrame( function () {
// render once texture has loaded
renderer.render( scene, camera );
} );
} );
bumpMapTexture.repeat.set( 2, 2 );
bumpMapTexture.wrapS = bumpMapTexture.wrapT = THREE.RepeatWrapping;
var groundMaterial = new THREE.MeshPhongMaterial( {
ambient: 0x00AA00,
color: 0x00AA00,
bumpMap: bumpMapTexture
} );
scene.add( new THREE.Mesh( new THREE.PlaneGeometry( 3, 3 ), groundMaterial ) );
camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.01, 100000 );
camera.position.set( 0, 0, 3 );
camera.lookAt( new THREE.Vector3( 0, 0, 0 ) );
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setSize( window.innerWidth, window.innerHeight );// renderer.render(scene, camera);
document.getElementById( 'scene-container' ).appendChild( renderer.domElement );
}
</script>
</body>
</html>
Это ссылка на Three.js r55 (минимизировано).
Любая помощь приветствуется.
1 ответ
Если вы хотите, чтобы текстура повторялась, ее размер в пикселях в каждом измерении должен быть степенью двойки (например, 512 x 256).
Если у вас есть диффузный map
и bumpMap
они должны быть одинаковыми offset/repeat
Настройки. Смотрите, например, этот ответ.
three.js r.55