내부적으로 Gameware Navigation은 다음 속성을 가진 좌표계를 통해 모든 데이터를 만들고 모든 내부 계산을 수행합니다.
이 좌표계의 축은 다음과 같은 규칙을 사용하여 정의됩니다. Y 또는 전면 축 양의 방향은 독자로부터 떨어져 화면 "안으로" 이동합니다.
게임 엔진에서 다른 좌표계를 사용하는 경우 값을 앞뒤로 변환해야 합니다. 다음 섹션을 참조하십시오.
CoordSystem 클래스는 게임에서 사용하는 좌표계와 Gameware Navigation에서 사용하는 좌표계 간에 좌표, 벡터, 거리 및 경계 상자를 변환하는 데 사용할 수 있는 선택적 도우미입니다.
다음 코드는 위쪽 축으로 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 또는 매크로를 사용하여 변환을 수행하는 것이 가장 좋습니다.
일반적으로 축에 정렬된 경계 상자는 상자의 두 극단을 사용하여 정의됩니다.
최소 및 최대의 좌표를 독립적으로 한 좌표계에서 다른 좌표계로 변환하면 대상 좌표계에 상자의 서로 다른 두 모서리가 생성됩니다.
예를 들어 게임 월드에서 왼손 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);