문제

헤이오,

저는 현재 카메라를 배치하여 카메라를 움직이지 않고 캐릭터의 전체 움직임을 볼 수 있도록 카메라를 배치 해야하는 프로젝트를 진행하고 있습니다. 캐릭터가 시작되는 위치와 캐릭터가 세 방향 (x, y, & z) 모두에서 이동하는 최대 거리가 있습니다. 또한 시야 (90도)도 있습니다.

전체 동작을보기 위해 이동할 필요가 없도록 카메라를 어디에 배치 해야하는지 알아내는 방정식이 있습니까?

참고 : 이것은 OpenGL을 사용합니다.

설명 : 카메라는 위에있는 것이 아니라 모션에있는 캐릭터의 "앞쪽"이어야합니다.

지상 비행기를 따라 움직일 것입니다.

도움이 되었습니까?

해결책

포인트의 경계 구체를 만드는 경우 카메라를 경계 구 / sin (FOV / 2)의 반경보다 더 멀리 또는 동일하게 유지하기 만하면됩니다.

예를 들어, 반경 반경이있는 경계 구체와 지정된 View FOV 필드가있는 경우 카메라는 경계 구의 중심을 향한 "Dist"포인트에 있어야합니다.

거리를 계산하기위한 방정식은 다음과 같습니다. dist = radius / sin (fov / 2);

이것은 모든 방향으로 카메라의 경우 3D로 작동합니다.

다른 팁

관찰 포트는 본질적으로 피라미드 모양이며 피라미드의 정점이 눈 위치에 있기 때문에 최대 범위 (x, y, z)를 갖는 것만으로는 충분하지 않습니다.

논쟁을 위해, 모든 움직임이 (x, z) 평면 (즉,지면)에 있고 눈이 y 축을 따라 10m 바로 위에 있다고 가정 해 봅시다.

90˚ 시야가있는 제곱 뷰포트를 가정하면 X와 Z 축을 따라 ± 10m에서 볼 수 있지만지면에있는 물체 (y = 0)에 대해서만 볼 수 있습니다. 그들이 땅에서 벗어나 자마자 당신의 견해가 줄어 듭니다. 지면의 1m이라면 (x, z) 범위는 ± 9m입니다.

어쨌든 진짜 카메라는 어쨌든 어떤 방향 으로든 장면에 배치 할 수 있습니다. 카메라의 "롤"각도조차도 보이는 금액을 변경할 수 있습니다. 실제로 이러한 카메라 포인트가 실제로 많으므로 기준을 다소 제한해야합니다.

STARTPOINT에서 엔드 포인트로 라인 세그먼트를 가져옵니다. 라인 세그먼트의 중간 점을 통해이 라인 세그먼트에 직교하는 평면을 구성하십시오. 그런 다음이 평면의 어딘가에 카메라를 교차점을보고있는 평면의 교차점에서 다음과 같은 거리에서 배치하십시오. 카메라의 위 벡터는 평면에 있어야하며 수평 시야는 90도 여야합니다.

distance = sqrt(dx^2 + dy^2 + dz^2) / 2

이 카메라 위치는 모두 뷰 포트의 왼쪽 또는 오른쪽 테두리에 STARTPOINT 및 엔드 포인트가 있으며 수직 중심이 있습니다.

또 다른 솔루션은 STARTPOINT, 엔드 포인트 및 화면에서 두 지점의 원하는 위치를 취하는 함수를 작성하는 것일 수 있습니다. 그런 다음 카메라 변환에 대한 투영 방정식을 해결하십시오.

예를 들어, 물체가 비행기에서 움직일 경우, 카메라를 공외에 배치 할 수 있습니다 (이는 FOV가 90이라는 사실에 따라 다릅니다).

객체가 3D로 이동하면 훨씬 더 어렵습니다. 물체가 움직이는 영역 (큐브 대 볼 ...)과보고 싶은 방향을 지정하면 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top