Можно ли создавать тени из DirectionalLight
?
Если я использую SpotLight
, тогда я вижу тень, но если я использую DirectionalLight
, это не сработает.
Можно ли создавать тени из DirectionalLight
?
Если я использую SpotLight
, тогда я вижу тень, но если я использую DirectionalLight
, это не сработает.
Да, вы, безусловно, можете использовать направленные света для отбрасывания теней. Вам нужно убедиться, что вы не используете MeshBasicMaterial
, поскольку они не поддерживают тени. Вместо этого используйте MeshLambertMaterial
или MeshPhongMaterial
.
Вам нужно включить тени для рендеринга с чем-то следующим образом:
renderer.shadowMapEnabled = true;
renderer.shadowMapSoft = true;
renderer.shadowCameraNear = 3;
renderer.shadowCameraFar = camera.far;
renderer.shadowCameraFov = 50;
renderer.shadowMapBias = 0.0039;
renderer.shadowMapDarkness = 0.5;
renderer.shadowMapWidth = 1024;
renderer.shadowMapHeight = 1024;
И затем вы должны включить теневое кастинг и получение тени на объект и на свет, чтобы вы имели
dirLight.castShadow = true;
object.castShadow = true;
otherObject.receiveShadow = true;
Затем, если свет и объекты помещаются в соответствующие положения. dirLight
приведет к тому, что тень object
будет отлита от otherObject
.
[EDIT]: Ниже приведена рабочая демонстрация для тех, кто хочет сделать что-то подобное. p >
Помните, что карты теней зависят от масштаба. Я работаю над сценой, где расстояние до единицы составляет один метр, а мои объекты составляют около 0,4 метра. Это довольно мало по стандартам Three.js. Если у вас тоже есть эта ситуация, вы можете сделать несколько важных шагов:
Посмотрите, как это сделать.
Обязательно включите визуализацию отладки на свет:
light.shadowCameraVisible = true;
Это покажет вам том, по которому вычисляется тень. Вот пример того, как это может выглядеть:
Обратите внимание на ближнюю и дальнюю плоскости (с черными крестами) и верхнюю/левую/нижнюю/правую сторону теневой камеры (внешние стены желтого окна). Вы хотите, чтобы этот ящик был плотно обтянут все объекты, которые вы собираетесь иметь в тени; возможно, даже сильнее, чем я здесь показываю.
Вот некоторые фрагменты кода, которые могут быть полезны.
var light = new THREE.DirectionalLight(0xffffff);
light.position.set(0, 2, 2);
light.target.position.set(0, 0, 0);
light.castShadow = true;
light.shadowDarkness = 0.5;
light.shadowCameraVisible = true; // only for debugging
// these six values define the boundaries of the yellow box seen above
light.shadowCameraNear = 2;
light.shadowCameraFar = 5;
light.shadowCameraLeft = -0.5;
light.shadowCameraRight = 0.5;
light.shadowCameraTop = 0.5;
light.shadowCameraBottom = -0.5;
scene.add(light);
Убедитесь, что некоторые объекты отбрасывают тени:
object.castShadow = true;
Убедитесь, что некоторые объекты получают тени:
object.receiveShadow = true;
Наконец, настройте некоторые значения в WebGLRenderer
:
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(canvasWidth, canvasHeight);
renderer.shadowMapEnabled = true;
renderer.shadowMapSoft = true;