检测 Object3D 是否正在接收阴影 (r86)

Detect if Object3D is receiving shadows (r86)

我希望能够检测物体是否在阴影中。执行此操作的最佳、最高效的方法是什么?

例如,场景中有一棵树和一个平行光。将一个角色移动到树下,他们现在正站在树的阴影中。您如何检测他们在什么时候进入/离开树的投射阴影?

这不是最终的解决方案,这只是您可以用作起点的一个选项。

这只是我从 whosebug.com 的另一部分回答的翻译,专门用于 Three.js。

思路:你设置一条从该点沿方向到光源的光线,如果它与任何物体相交,则该点在阴影中,否则不在阴影中。

给定:平面上的点 pointOnPlane,定向光源位置的归一化向量(这将是我们的方向)direction 和场景中的对象数组 sceneObjects(我们想要找到交集)。要确定该点是否有阴影,我们需要一个简短的函数:

var raycasterPoint = new THREE.Raycaster();
var direction = new THREE.Vector3();// for re-use

function isShaded(pointOnPlane){
  direction.copy(light.position).normalize();
  raycasterPoint.set(pointOnPlane, direction); // ray's origin and direction
  var retVal = false;
  var pointIntersects = raycasterPoint.intersectObjects( sceneObjects );
  if (pointIntersects.length > 0) retVal = true;
  return retVal;
}

jsfiddle 示例。