2013-08-12 3 views
0

저는 큐브 주위를 돌고있는 카메라를 가진 간단한 Three.js 장면을 항상 보았습니다. 큐브 주위를 돌면서 카메라가 현재 가장 잘 보이는면의 비율을 알아야합니다.입방체의 얼마나 많은 부분을 볼 수 있습니까?

그래서 똑바로보고 있으면 측면 1 ("전면")은 100 %를 볼 수 있고 다른 모든 5면은 0 %입니다. 카메라를 오른쪽으로 살짝 돌리면 옆면 2 ("오른쪽면")의 일부가 이제는 볼 수 있습니다 (아마도 20 %). 사이드 1은 이제 % 80에서 볼 수 있습니다. 그런 다음 약간 위로 회전하면 측면 3 (상단)이 10 % 표시됩니다.

어떻게 알아낼 수 있습니까? 큐브 자체는 회전하지 않으며 카메라 만 회전한다는 것을 기억하십시오. Three.js 또는 JavaScript는 훌륭하지만 모든 프로그래밍 언어를 처리 할 수 ​​있습니다. 나는 이것을 달성하는 방법에 대한 아이디어에 주로 관심이 있습니다.

+0

얼굴을 100 % 보았을 때 얼굴이 더 작게 보입니다. 나는 당신이 얼굴의 20 %를 볼 수 있다고 말하는 것이 옳지 않다고 생각합니다 ... 당신은 일정 비율을 가지고 있습니다. 무엇의 비율? 렌더링 된 각면이 차지하는 스크린 공간에서 렌더링 된 전체 모양의 비율입니까? – WestLangley

+0

예, 기술적으로는 사실이지만 설명하는 방법을 모르겠습니다. 어떻게 설명 할 수 있니? –

답변

1

또 다른 옵션으로, 카메라의 뷰 벡터와 큐브의 내적을 계산할 수 있습니다. 그런 다음 내적에서도 각도를 계산하면 카메라 뷰 벡터에 상대적인 각 얼굴 법선의 각도를 알 수 있습니다. 이 방법이 효과가있다면 그다지 잘 모르겠다. 따라서 90 도가 넘는 모든 것이 전혀 보이지 않으며 0 도가 카메라를 완전히 마주보고 있습니다. 글쎄, 백분율에 대해서는 잘 모르겠지만 유스 케이스는 모른다. 어떻게 든 Gero3에 의해 제안 된 스크린 공간 작업을 저장하는 것에 대해 생각했습니다. 단지 얼굴 법선의 각도 만 사용하면됩니다. 예를 들어 입방체의 가장자리를보고 카메라보기 방향에서 45도 각도로 2면 있으면 두면 각각 50 %라는 것을 알 수 있습니까?

+0

실제로는 더 간단하게 들리며 마음에있는 것과 비슷합니다. 나는 그것을 시도 할 것이다. –

+0

이 방법은 완벽하게 작동했습니다. 제안 해 주셔서 감사합니다. –

+0

쿨, 다행 당신의 사용 케이스 :) – GuyGood

1

먼저 화면 공간에서 정점의 위치를 ​​계산합니다.

방법 :

var screenspaceVertexPosition = vertex.position.applyProjection(
    this.projectionMatrix.multiplyMatrices(object.matrixWorld)) 

모두 8 개 정점에 대해이 작업을 수행합니다. 그러면 비행기 법선을 확인하여 어떤 평면이 보이는지 파악하십시오. 화면 공간에서 각면이 사용하는 면적을 계산하십시오. 여기에서 전체 가시 영역과 백분율을 계산할 수 있습니다.

+0

"this"가 무엇입니까? 저거 카메라 야? 그리고 큐브의 측면 인 "대상"은 정상입니까? –

관련 문제