버그 해결을 위한 모든 질문을 던져
0 votes
120 views

https://threejs.org/manual/examples/align-html-elements-to-3d-globe.html

위의 링크가 예제 소스의 실행 결과입니다.

 

https://threejs.org/manual/#ko/align-html-elements-to-3d

위의 링크의 가장 마지막에 있는 예제로 소스도 볼 수 있습니다.

 

이 프로그램은 지구본을 만들고, 

각 나라의 위치에 나라의 이름을 보이게 만드는데,

지구본 뒤편에 있는 나라는 보이지 않고 카메라가 보는 면에만 나라의 이름이 나옵니다.

 

지구본 뒤편에 나라이름이 안나오게 하는 원리가 뭐냐면 

카메라에서 특정한 나라의 위치로 향하는 벡터와 지구본 중심에서 그 나라의 위치로 향하는 벡터를 내적하여 나온 결과가  0보다 작으면 나라의 이름이 보이고, 0보다 크면 나라의 이름이 안보이도록 하는 방식입니다. 

궁금하게 뭐냐면 카메라에서 나라의 위치로 향하는 벡터와 중심에서 나라의 위치로 향하는 벡터를 구하는 방법인데요.

소스를 보면 이렇게 되어 있습니다.

 

      normalMatrix.getNormalMatrix(camera.matrixWorldInverse); 

      // Orient the position based on the camera's orientation.

      // Since the sphere is at the origin and the sphere is a unit sphere

      // this gives us a camera relative direction vector for the position.

      tempV.copy(position);

      tempV.applyMatrix3(normalMatrix);

 

      // compute the direction to this position from the camera

      cameraToPoint.copy(position);

      cameraToPoint.applyMatrix4(camera.matrixWorldInverse).normalize();

 

결과만 이야기하면 tempV에는 지구본 중심에서 나라로 향하는 벡터가 저장이 되고, cameraToPoint에는 카메라에서 나라로 향하는 벡터가 저장이 되게 됩니다.

지구본 중심에서 나라로 향하는 벡터 구하는 부분 :

      normalMatrix.getNormalMatrix(camera.matrixWorldInverse); <- 카메라의 월드 좌표의 역행렬(4*4)을 가져와서 위치부분을 제외하고  (3*3)으로 변환. 

      tempV.copy(position);  <- tempV 에 나라의 위치(position)를 복사. 

      tempV.applyMatrix3(normalMatrix); <- tempV에 저장된 나라의 위치에 카메라의 역행렬(3*3)을 곱하면 중심에서 나라의 위치로 가는 벡터가 구해짐.

카메라에서 나라의 위치로 향하는 벡터 구하는 부분 : 

      cameraToPoint.copy(position); <- cameraToPoint에 나라의 위치(position)를 복사 (위에서 복사한 위치와 같은 값)

      cameraToPoint.applyMatrix4(camera.matrixWorldInverse).normalize();  <- camera에 저장된 나라의 위치에 카메라의 역행렬(4*4)을 곱하면 카메라에서 나라의 위치로 향하는 벡터가 구해짐.

 

이해가 안가는 부분은 굵게 표시한 부분입니다.

3*3 역행렬을 곱한 것과 4*4 역행렬을 곱한 것의 차이와 원리를 모르겠습니다.

3*3은 R, U, L 정보만 가지고 있고, 4*4는 R, U, L, Position 을 가지고 있는데 각각 용도와 원리가 어떻게 되나요?

그리고 cameraToPoint는 Vector3인데, 열이 3개인 Vector3와 행이 4개인 camera.matrixWorldInverse를 어떻게 곱할 수 있는지 이해가 가지 않습니다.

asked (2 point) , 120 views

1 답변

+1 vote
homogeneous coordinate를 찾아보세요.

3차원 벡터를 동차좌표계에서는 4차원으로 표현하는데,

공간상의 위치를 표현하는 점벡터는 (x, y, z, 1)

위치 정보가 없는 방향벡터는 (x, y, z, 0)으로 표현합니다.

 

이 둘에 4x4 변환 행렬을 곱해보면

w성분이 1인 점벡터는 위치 변환이 적용되고

w성분이 0인 방향벡터는 위치 변환이 적용되지 않습니다.

 

질문으로 돌아와서

3x3 행렬과 3차원 벡터를 곱하는 것은 4x4 행렬과 w성분이 0인 방향벡터를 곱하는 것과 같습니다.

원점은 지구본의 중심에 있으므로 나라의 위치를 나타내는 점벡터는 지구 중심에서 나라를 향하는 방향벡터와 같습니다.

이 방향벡터를 카메라의 로컬로 가져오는 변환이 앞의 연산입니다.

뒷 부분에서 3차원 벡터를 4x4행렬과 곱하는 것은 w성분을 1로 설정하고 곱하는 것으로 보입니다.

이렇게하면 월드좌표에서 나라의 위치를 카메라의 로컬좌표로 가져오는 변환이 됩니다.

즉 카메라의 로컬좌표에서 카메라의 위치(로컬좌표의 원점)에서 나라의 위치를 가리키는 방향벡터를 얻게 됩니다.
answered (266 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

558 질문
717 answers
694 댓글
118,268 users