Излучающий источник света не влияет на затенение других объектов Three.js

#javascript #three.js

#javascript #three.js

Вопрос:

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

 // add subtle ambient lighting
var ambientLight = new THREE.AmbientLight(0x0c0c0c);
scene.add(ambientLight);

// add spotlight for the shadows
var spotLight = new THREE.PointLight(0xffffff);
spotLight.position.set(-200, 50, 150);
spotLight.castShadow = true;
scene.add(spotLight);
  

Я создал объект sun и попытался придать ему излучающее свойство, чтобы он мог освещать и другие планеты. Хотя кажется, что планета в некотором смысле светится, это скорее просто объект, который освещается и не имеет затенения, чем фактически становится источником света. Код для объекта sun выглядит следующим образом

  function createSunMesh(geom) {
     var loader = new THREE.TextureLoader();
     var planetSunTexture = loader.load("../assets/textures/planets/sun.jpg");
     //var normalSunTexture = loader.load("../assets/textures/planets/moonbump.jpg");

     var planetSunMaterial = new THREE.MeshLambertMaterial({map: planetSunTexture, emissive: 0xac3d25});
     //bumpMap: normalMoonTexture

     // create a multimaterial
     var planetSunMesh = THREE.SceneUtils.createMultiMaterialObject(geom, [planetSunMaterial]);
     planetSunMesh.visible = false;

     return planetSunMesh;
 }
  

Итак, мой вопрос в том, есть ли способ сделать излучающее свойство света более сильным / достаточно сильным, чтобы воздействовать на другие объекты? Я пытался использовать оба материала Lambert / Phong, но они, похоже, имеют тот же эффект, что и друг у друга.

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

1. вы говорите о взаимодействии света между объектами в сцене и three.js не поддерживает это из коробки. вы можете увидеть пример по webgl_raymarching_reflect.html адресу, но вам придется реализовать этот (или аналогичные алгоритмы) самостоятельно.

2. @gaitat Было бы сложно реализовать такую функцию?

3. взаимодействие со светом не считается простой функцией для реализации. существует множество алгоритмов, которым нужно следовать. если вы ограничите масштаб проблемы, она может стать разрешимой.

4. @gaitat в этом случае можно ли полностью удалить точечный свет, чтобы все объекты были одинаково освещены? потому что в настоящее время мой свет отправляется только с одного направления, что значительно затрудняет просмотр некоторых моих моделей

5. я не видел вашего приложения, я не знаю, что оно делает, и я не знаю, чего вы хотите достичь; в принципе, это ваше решение.

Ответ №1:

В итоге я переместил основной прожектор так, чтобы он находился внутри моего объекта sun, что дало ему тот же эффект, который я искал. Кроме того, я увеличил интенсивность и уменьшил затухание, чтобы придать свету более реалистичный эффект