사용자가 구 표면 주위를 이동할 수있는 정비공을 코딩하고 있습니다. 구의 위치는 현재 theta
및로 저장되며 phi
, 여기서 theta
현재 위치의 z 축과 xz 투영 사이의 각도 (즉, y 축을 중심으로 한 회전)이며 y 축 phi
에서 위치까지의 각도입니다. 나는 그것을 잘못 설명했지만 본질적 theta = yaw
으로phi = pitch
Vector3 position = new Vector3(0,0,1);
position.X = (float)Math.Sin(phi) * (float)Math.Sin(theta);
position.Y = (float)Math.Sin(phi) * (float)Math.Cos(theta);
position.Z = (float)Math.Cos(phi);
position *= r;
나는 이것이 정확하다고 생각하지만 틀릴 수 있습니다. 반경이있는 월드 공간의 원점에서 구의 표면을 중심으로 임의의 의사 2 차원 방향으로 움직일 수 있어야합니다 r
. 예를 들어, 홀딩 W은 플레이어의 방향에 대해 위쪽으로 구 주위를 움직여야합니다.
구의 위치 / 방향을 나타내는 데 쿼터니언을 사용해야한다고 생각하지만 올바른 방법을 생각할 수는 없습니다. 구면 기하학은 나의 강한 소송이 아닙니다.
기본적으로 다음 블록을 채워야합니다.
public void Move(Direction dir)
{
switch (dir)
{
case Direction.Left:
// update quaternion to rotate left
break;
case Direction.Right:
// update quaternion to rotate right
break;
case Direction.Up:
// update quaternion to rotate upward
break;
case Direction.Down:
// update quaternion to rotate downward
break;
}
}
(1,1,1)
왼쪽 을 잡고있는 플레이어 는 구 주위를 회전하고 (~1.2,0,~-1.2)
, 다음 (-1,-1,-1)
, 그리고을 통과 (~-1.2,0,~1.2)
합니다 (1,1,1)
.
theta
하고 phi
위치가 업데이트되면 문제가 불필요하게 복잡해집니다. 각 프레임 (하나는 변경되지 않음)과 Vector3.Transorm
구 주위의 2 개의 회전 축을 간단히 계산하는 것이 훨씬 쉽습니다 . 이렇게하면 문제가 간단 해지지 만 phi
& 연결을 끊을 수 있습니다 theta
.