2017-10-16 17 views
0

그림자가 있는지 여부를 감지하고 싶습니다. 가장 효과적인 방법은 무엇입니까?Object3D가 그림자를 받고 있는지 감지하십시오 (r86)

예 : 장면에 나무가 있으며 방향성이 있습니다. 나무 아래에있는 한 캐릭터를 움직이면 이제는 나무가 던져 놓은 그림자에 서 있습니다. 그들이 나무의 주조 된 그림자를 입력/떠난 지점을 어떻게 감지 할 수 있습니까?

+0

정확하게 원하는 것을 이해하는 데 귀하의 질문이 너무 명확하지 않습니다. 다시 작업해야합니다. 명확히하기 위해 원하는 결과가있는 이미지를 추가 할 수 있습니까? – prisoner849

+0

@ prisoner849 업데이트 됨 –

답변

1

이것은 궁극적 인 해결책이 아니며 시작점으로 사용할 수있는 옵션입니다.

그리고 이것은 Three.js 전용 인 stackoverflow.com의 다른 세그먼트에서 얻은 나의 답을 번역 한 것입니다.

아이디어 : 광원을 향한 방향에서 광선을 설정하고 어떤 물체와 교차하는 경우 그 점은 그림자에 있어야합니다. 그렇지 않으면 그렇지 않습니다.

감안할 때 : 점 비행기 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