我希望能够检测到对象是否在阴影中。什么是最好的,最高效的方式来做到这一点?检测Object3D是否接收到阴影(r86)
例如,场景中有一棵树和一个方向灯。在树下移动一个角色,他们现在站在树的阴影中。你怎么能检测到他们进入/离开树的投影?
我希望能够检测到对象是否在阴影中。什么是最好的,最高效的方式来做到这一点?检测Object3D是否接收到阴影(r86)
例如,场景中有一棵树和一个方向灯。在树下移动一个角色,他们现在站在树的阴影中。你怎么能检测到他们进入/离开树的投影?
这不是最终的解决方案,这只是一个可以用作起点的选项。
而这仅仅是我的答案从另一段stackoverflow.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例子。
好的,是的!我认为你也可以将光线从物体转向光源,看它是否碰到阴影投射物体。我唯一担心的是,这种解决方案可能无法覆盖除定向光之外的其他任何物体所导致的阴影。但也许解决方案需要根据灯的类型而改变。 –
你可以从一个光源的位置减去一个物体的位置(如果它不是一个方向光),然后对它进行标准化,这样你就可以得到方向。 – prisoner849
你的问题不是很清楚明白你到底想要什么。你需要重新工作。为了澄清,你还可以添加一个图像与所需的结果? – prisoner849
@ prisoner849已更新 –