2017-10-16 42 views
0

我希望能夠檢測到對象是否在陰影中。什麼是最好的,最高效的方式來做到這一點?檢測Object3D是否接收到陰影(r86)

例如,場景中有一棵樹和一個方向燈。在樹下移動一個角色,他們現在站在樹的陰影中。你怎麼能檢測到他們進入/離開樹的投影?

+0

你的問題不是很清楚明白你到底想要什麼。你需要重新工作。爲了澄清,你還可以添加一個圖像與所需的結果? – prisoner849

+0

@ prisoner849已更新 –

回答

1

這不是最終的解決方案,這只是一個可以用作起點的選項。

而這僅僅是我的答案從另一段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; 
} 

Is point shaded

jsfiddle例子。

+0

好的,是的!我認爲你也可以將光線從物體轉向光源,看它是否碰到陰影投射物體。我唯一擔心的是,這種解決方案可能無法覆蓋除定向光之外的其他任何物體所導致的陰影。但也許解決方案需要根據燈的類型而改變。 –

+0

你可以從一個光源的位置減去一個物體的位置(如果它不是一個方向光),然後對它進行標準化,這樣你就可以得到方向。 – prisoner849