#javascript #3d #webgl #three.js
#javascript #3D #webgl #three.js
Вопрос:
Я пытаюсь отобразить набор фотографий, расположенных в трехмерном пространстве, которые отбрасывают тени друг на друга. Я начинаю с двух прямоугольников, и вот мой код
function loadScene() {
var WIDTH = 1200,
HEIGHT = 500,
VIEW_ANGLE = 45,
ASPECT = WIDTH / HEIGHT,
NEAR = 0.1,
FAR = 10000,
world = document.getElementById('world'),
renderer = new THREE.WebGLRenderer(),
camera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR),
scene = new THREE.Scene(),
texture = THREE.ImageUtils.loadTexture('image.jpg', {}, function() {
renderer.render(scene, camera);
}),
material = new THREE.MeshLambertMaterial({map: texture}),
solidMaterial = new THREE.MeshPhongMaterial({color: 0xCC0000}),
rectangle = new THREE.PlaneGeometry(200, 120),
mesh = new THREE.Mesh(rectangle, material),
mesh1 = new THREE.Mesh(rectangle, material),
spotLight = new THREE.SpotLight(0xFFFFFF, 1.3);
camera.position.set(0, 0, 200);
mesh.translateX(140);
mesh.translateZ(-70);
mesh.receiveShadow = true;
mesh1.castShadow = true;
spotLight.position.x = -100;
spotLight.position.y = 230;
spotLight.position.z = 230;
spotLight.castShadow = true;
scene.add(spotLight);
scene.add(mesh);
scene.add(mesh1);
renderer.setSize(WIDTH, HEIGHT);
renderer.shadowMapEnabled = true;
renderer.render(scene, camera);
world.appendChild(renderer.domElement);
}
Здесь solidMaterial
сплошной красный цвет, и material
это текстурированный материал. Что я получаю, так это следующее:
- Если я использую
material
для обеих сеток, прямоугольники отображаются, как и ожидалось, но без теней. То же самое, если я используюsolidMaterial
для обоих. - Если я использую
material
formesh
(тот, что дальше) иsolidMaterial
formesh1
, я вижу красный прямоугольник, который отбрасывает тень на текстурированный. Это единственный случай, который работает так, как я ожидал. - Если я использую
solidMaterial
formesh
(тот, что дальше) иmaterial
formesh1
, я вижу красный прямоугольник с тенью на нем, но текстурированный прямоугольник впереди вообще не рисуется.
Как правильно использовать тени?
Ответ №1:
Оказывается, тень не появляется, когда два прямоугольника имеют одинаковый материал. Интересно, является ли это ошибкой в THREE.js .
С другой стороны, если я использую два разных материала, тень будет выглядеть так, как ожидалось, даже если они имеют одинаковую текстуру.
Комментарии:
1. Я не знаю внутренностей Three.js , но я бы рискнул предположить, что он рисует всю геометрию, которая разделяет материал, за один вызов. К сожалению, это очень затрудняет затенение, но, вероятно, это разумный компромисс для повышения производительности в других местах. Кроме того, поскольку вы нашли такой простой обходной путь для своего случая, я сомневаюсь, что есть большая необходимость «исправлять» это поведение.