좌표계

내부적으로 Gameware Navigation은 다음 속성을 가진 좌표계를 통해 모든 데이터를 만들고 모든 내부 계산을 수행합니다.

이 좌표계의 축은 다음과 같은 규칙을 사용하여 정의됩니다. Y 또는 전면 축 양의 방향은 독자로부터 떨어져 화면 "안으로" 이동합니다.

이에 대한 결과는 다음과 같습니다.

게임 엔진에서 다른 좌표계를 사용하는 경우 값을 앞뒤로 변환해야 합니다. 다음 섹션을 참조하십시오.

주:몇 가지 예외가 있지만 이들은 함수 또는 메서드 이름에서 ClientCoordinates의 존재로 명백하게 나타납니다. 예를 들면 ClientInputConsumer::ConsumeTriangleFromPosInClientCoordinates()입니다.

CoordSystem 도우미 클래스

CoordSystem 클래스는 게임에서 사용하는 좌표계와 Gameware Navigation에서 사용하는 좌표계 간에 좌표, 벡터, 거리 및 경계 상자를 변환하는 데 사용할 수 있는 선택적 도우미입니다.

이 클래스를 사용하려면

  1. CoordSystem 클래스의 인스턴스를 만들고 CoordSystem::Setup()을 호출하여 초기화합니다.
  2. 데이터를 앞뒤로 변환하려면 해당 클래스 메서드를 호출합니다.

CoordSystem 설정

다음 코드는 위쪽 축으로 Y축을 사용하고 센티미터로 거리를 표시하는 게임에서 사용할 CoordSystem을 설정하는 방법을 보여줍니다.

Kaim::CoordSystem coordSystem = Kaim::CoordSystem();
    KyFloat32 oneMeterInClientUnits = 100.f;
    Kaim::CoordSystem::ClientAxis clientRightAxis = Kaim::CLIENT_X;
    Kaim::CoordSystem::ClientAxis clientFrontAxis = Kaim::CLIENT_MINUS_Z;
    Kaim::CoordSystem::ClientAxis clientUpAxis = Kaim::CLIENT_Y;
 
    coordSystem.Setup(  oneMeterInClientUnits, 
                        clientRightAxis, 
                        clientFrontAxis, 
                        clientUpAxis ); 

좌표 및 벡터 변환

예를 들어 다음 호출에서는 지정된 위치를 게임 엔진에 사용된 좌표계에서 Gameware Navigation 좌표계로 변환합니다.

Kaim::Vec3f navPos = coordSystem.ClientToNavigation_Pos(position);

마찬가지로 다음 호출에서는 지정된 방향 벡터를 Gameware Navigation 좌표계에서 게임 엔진에 사용된 좌표계로 변환합니다.

Kaim::Vec3f navDir = coordSystem.NavigationToClient_Normal(dir);

CoordSystem 클래스에서 제공하는 변환 메서드는 부동 소수점 수를 사용하여 거리 측정을 나타내고 부동 소수점 수 배열을 사용하여 좌표를 나타냅니다. 이중 정밀도 숫자를 사용하는 경우 데이터를 변환하려면 추가 프로세스를 수행해야 할 수 있습니다.

물론 함수를 직접 작성하여 데이터 변환을 캡슐화할 수도 있습니다. 이렇게 하면 코드 중복을 최소화하고 함수가 게임에서 사용하는 것과 동일한 데이터 유형을 허용하고 반환하도록 하여 유형 안전을 보장할 수 있습니다.

경계 상자 변환

경우에 따라 Gameware Navigation 좌표계와 게임 엔진에 사용된 좌표계 간에 경계 상자를 변환해야 할 수 있습니다. 이런 경우 좌표계 간 경계 상자 변환은 까다로울 수 있으므로 CoordSystem 또는 매크로를 사용하여 변환을 수행하는 것이 가장 좋습니다.

일반적으로 축에 정렬된 경계 상자는 상자의 두 극단을 사용하여 정의됩니다.

  • 최소 또는 X, Y 및 Z 값이 가장 작은 모서리.
  • 최대 또는 X, Y 및 Z 값이 가장 큰 모서리.

최소 및 최대의 좌표를 독립적으로 한 좌표계에서 다른 좌표계로 변환하면 대상 좌표계에 상자의 서로 다른 두 모서리가 생성됩니다.

예를 들어 게임 월드에서 왼손 Z축 위쪽 좌표계를 사용하는 경우 Gameware Navigation에서 사용하는 오른손 Z축 위쪽 좌표계로 좌표를 매핑하면 (-X, Y, Z)와 같이 변환될 수 있습니다. 최소 및 최대의 좌표가 (minX, minY, minZ) 및 (maxX, maxY, maxZ)인 경우 이러한 좌표를 독립적으로 변환하면 (-minX, minY, minZ) 및 (-maxX, maxY, maxZ)가 생성됩니다. 처음에는 maxX가 minX보다 반드시 높았으므로 변환 후에는 -maxX가 -minX보다 반드시 낮아져야 합니다. 경계 상자의 대각선 반대쪽 모서리를 나타내는 이 두 좌표 세트가 더 이상 극단을 나타내지 않습니다.

좀더 구체적인 예로 최소는 원점(0, 0, 0)에 있고 최대는 모서리(100, 100, 100)에 있는 축에 정렬된 큐빅 경계 상자를 살펴보겠습니다. 이러한 두 좌표 세트를 독립적으로 변환하면 (-0, 0, 0) 및 (-100, 100, 100) 좌표가 생성됩니다. 이러한 모서리는 더 이상 최소, 즉 X, Y 및 Z 값이 가장 작은 모서리와 최대, 즉 X, Y 및 Z 값이 가장 큰 모서리를 나타내지 않습니다. 대신 변환된 경계 상자의 최소는 (-100, 0, 0)이 되고 최대는 (-0, 100, 100)이 되어야 합니다.

CoordSystem 클래스에서는 경계 상자를 변환할 때 이러한 문제를 고려하고 상자를 정의하는 데 사용된 모서리가 대상 좌표계에서 항상 최소 및 최대가 되도록 합니다.

예를 들어 다음 호출에서는 경계 상자를 게임 엔진에 사용된 좌표계에서 Gameware Navigation 좌표계로 변환합니다.

Kaim::Box3f navAABB;
coordSystem.ClientToNavigation_Box(gameMinima, gameMaxima, navAABB);