Плоскость самозатенения, на которую влияет карта смещения, не работает

#three.js

#three.js

Вопрос:

Работаю над какой-то вымышленной картой сокровищ. Я разрезаю большую карту смещения на меньшие плитки, поскольку я еще не знаю, насколько широким будет конечный ландшафт — сейчас это 5 * 5, но в будущем он может быть шире

По некоторым причинам у меня возникают проблемы с проецированием теней на смещенные плоскости. Я не знаю, откуда берется проблема. Возможно, это способ, которым я помещаю сетки в массив с помощью функции, боюсь, я делаю это неправильно.

Я хотел бы добиться результата, используя направленный свет

Вот черновик c4d того, чего я пытаюсь достичь

и вот что я могу сделать в браузере (пока не удалось правильно их разметить: ^)

 var renderer = new THREE.WebGLRenderer();
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;

var material = [];
var texture = [];
var tile = [];

var planeRes = 128;
var planesize = 1;

var dim = 5;
var size = dim * dim;

var DispScale = 2;

var geometry = new THREE.PlaneBufferGeometry(planesize,planesize,planeRes, planeRes);


function tileGenerator(inc) {
  if (inc < 10) {
    texture[inc] = new THREE.TextureLoader().load('cut25lowres/image_part_00'   inc   '.jpg');
  } else {
    texture[inc] = new THREE.TextureLoader().load('cut25lowres/image_part_0'   inc   '.jpg');
  }
  material[inc] = new THREE.MeshPhongMaterial({
    color: 0xffffff,
    displacementMap: texture[inc],
    side: THREE.DoubleSide,
    receiveShadow : true,
    castShadow : true
  });
  tile[inc] = new THREE.Mesh(geometry, material[inc]);
}

for (var i = 1; i < size   1; i  ) {
  tileGenerator(i);
}


for (var i = 1; i < size   1; i  ) {
  tile[i].position.set(-planesize * (i % dim) 1, 0, -planesize * Math.ceil(i / dim) 1 );
  tile[i].rotation.x = Math.PI / 2   Math.PI;
  tile[i].rotation.z = Math.PI / 2;

  scene.add(tile[i]);
}

var dirLight = new THREE.DirectionalLight( 0xffffff, 1 );
dirLight.castShadow = true;

dirLight.shadow.camera.near = 0.1;
dirLight.shadow.camera.far = 6;
dirLight.shadow.mapSize.set( 1024, 1024 );
var targetObject = new THREE.Object3D();
targetObject.position.x = -10;
targetObject.position.z = -10;

dirLight.position.y = 3;

scene.add(targetObject);

dirLight.target = targetObject;
scene.add( dirLight );

  

Редактировать: вот более чистая версия без массива, поскольку это не часть проблемы
jsfiddle.net/clemtre/3y9tqc6j/34

 
var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;

renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var controls = new THREE.OrbitControls(camera, renderer.domElement);

var scene = new THREE.Scene();

var heightmap = new THREE.TextureLoader().load('https://i.imgur.com/MVYhfd7.jpeg');
var geometry = new THREE.PlaneGeometry(20, 20, 100, 100);
var material = new THREE.MeshPhongMaterial({
  color: 0xffffff,
  displacementMap: heightmap,
  displacementScale: 10
});


var light = new THREE.DirectionalLight(0xffffff);
light.position.set(0, 1, 1).normalize();
light.castShadow = true;
scene.add(light);

var plane = new THREE.Mesh(geometry, material);
plane.rotation.x = -Math.PI/2;
scene.add(plane);

camera.position.z = -20;
camera.position.y = 5;
controls.update();

var animate = function() {
  requestAnimationFrame(animate);

  controls.update();

  renderer.render(scene, camera);
};

animate();

  

Большое спасибо!

Комментарии:

1. Можете ли вы добавить рабочую демо-версию? Либо через jsfiddle, либо через фрагмент кода ?

2. Вот оно : jsfiddle.net/clemtre/3y9tqc6j/34