채널은 NavMesh의 한 위치에서 다른 위치까지의 경로 주위의 탐색 가능한 공간을 간소화하여 표현한 것입니다. 일종의 두꺼운 경로(예: 도로)로 간주할 수 있습니다.
채널은 단순한 방식으로 탐색 가능한 공간을 나타내는 가장 간단한 구조를 가집니다. 채널의 정보는 예정된 회전을 예측하는 봇 회전 기능에서 구속조건을 고려하는 궤적을 계산하기 위해 쉽게 액세스할 수 있습니다.
채널은 게이트의 배열입니다. 두 개의 인접한 게이트 사이의 쿼드 또는 삼각형을 채널 단면이라고 합니다. 각 섹션은 모든 NavMesh 장애물로부터 완전히 자유롭습니다. 다음 그림을 참조하십시오.

NavGraph를 통과하는 경로는 여러 채널과 연결됩니다. 유효한 채널을 갖기 위해 경로 주위에 충분한 공간(폭)을 사용할 수 없는 경우 채널이 NavMesh에서 분할됩니다. 따라서 각 NavMesh에 놓인 경로 부분에 두 개 이상의 채널이 있을 수 있습니다. 이러한 모든 채널은 경로로 집계되는 ChannelArray로 수집됩니다. 다음 그림을 참조하십시오.

채널에는 사전 채널 단면과 사후 채널 단면이 있습니다. 사전 채널 단면 및 사후 채널 단면이 시계 반대 방향으로 열린 폴리선으로 분할됩니다. 시계 반대 방향으로 열린 폴리선이 첫 번째 게이트 또는 마지막 게이트를 사용하여 닫힙니다. 사전 채널 단면 및 사후 채널 단면은 각각 첫 번째 단면 및 마지막 단면의 연장입니다. 이러한 단면은 NavMesh 테두리에서 추출된 단순화된 폴리선이므로 사전 채널 단면 또는 사후 채널 단면의 각 위치에서 마무리 게이트의 직각 투영을 볼 수 있습니다. 다음 그림을 참조하십시오.

채널이 없는 경로에서는, 하한 경계와 상한 경계가 NavMesh의 동적 변경 사항에 따라 경로의 탐색 가능한 부분을 분할하기 위해 계산됩니다. 하한 경계와 상한 경계의 모든 단면에 장애물이 없는지 확인하기 위해 하한 경계와 상한 경계가 게이트 위치에 있습니다. 어떤 장애물이든지 단면과 충돌하면 모든 단면이 무효화됩니다. 사전 채널 단면 또는 사후 채널 단면과 충돌하는 장애물은 첫 번째 단면 또는 마지막 단면을 각각 무효화합니다.
경로 찾기 쿼리 내에 채널을 만들 수 있습니다. Kaim::Bot에서 함수(예: Kaim::Bot::ComputeNewPathToDestination 또는 Kaim::Bot::InitAStarQueryForBot)를 사용하여 경로 찾기 쿼리를 실행할 때 봇 궤적 모드가 Kaim::TrajectoryMode_Spline이면 채널이 자동으로 계산됩니다. 경로 찾기 쿼리를 초기화하고 실행하는 경우 SetComputeChannelMode 함수를 사용하여 채널 계산을 활성화할 수 있습니다. 쿼리가 NavMesh에서 각각의 미세 조정된 경로 부분 주위로 새 채널을 구성하는 ChannelArray 계산 단계로 들어갑니다. 그런 다음 원래 경로가 채널 집계 및 변경되지 않고 남아 있는 NavGraph 기반의 원래 경로 부분으로 바뀝니다.
채널은 원래의 미세 조정된 경로 주위의 여유 공간을 수집하여 계산됩니다. 사용 가능한 여유 공간을 찾은 다음 반지름 어댑티브 문자열 당기기가 이러한 모서리에서 최대 여유 공간을 고려하여 필수 회전을 찾습니다. 그러면 채널의 회전 게이트가 결정됩니다. 그런 다음 가능할 때마다 사용 가능한 공간을 확장하기 위해 회전 사이의 긴 거리가 있는 경우 중간 게이트가 추가되며 이는 궤적에서 더 넓은 회전을 찾는 데 사용됩니다.
SDK에는 채널에 맞는 원-호 기반 스플라인을 유지하고 따르는 SplineTrajectory 구성요소가 함께 제공됩니다. 이 CircleArcSpline은 원 호(자홍색)와 세그먼트(녹청색)로 구성되어 있습니다. 다음 그림을 참조하십시오.

스플라인은 각 면의 모서리까지 기본 설정 거리를 설정하고 기본 설정 반지름을 가진 원에 놓이도록 최적화됩니다. 그러나 채널이 너무 제약된 경우 이들이 릴리스되고 이러한 위치에서는 스플라인이 변경되지 않은 상태로 유지됩니다(하위 최적).
디그레이드 모드(SplineComputation_Degraded)에 있는 경우 스플라인이 다시 계산됩니다. 스플라인이 다시 계산되지 않는 경우 채널 궤적을 업데이트할 때 지정된 거리(기본값은 5m) 이상으로 현재 스플라인의 꼬리가 수정되지 않습니다. 그러면 예정된 회전을 예측하는 안정된 궤적이 프레임 간에 제공됩니다. 봇의 애니메이션 구동 보행에 대한 애니메이션 시스템을 제공하기 위해 SplineTrajectory를 사용하여 정확하고 안정된 정보를 얻을 수 있습니다.
스플라인에 액세스하면 현재 스플라인에서의 봇 위치 및 스플라인이 계산되는 방법을 알 수 있습니다. 다음 예를 참조하십시오.
Kaim::ITrajectory* trajectory = m_bot->GetTrajectory(); //The bot has no trajectory, if it does not have a path. Kaim::FollowedCircleArcSpline* followedSpline = trajectory-> GetFollowedCircleArcSpline(); // Give the following information. followedSpline->m_spline;// Previously, trajectory->GetSpline() followedSpline->m_positionOnSpline; //Previously, trajectory->GetPositionOnSpline() followedSpline->m_computationMode
경로를 다시 계산해야 하는지 알기 위해 스플라인 계산 모드를 확인하지 않아도 됩니다. m_bot->IsPathRecomputationNeeded()를 호출하면 경로를 다시 계산해야 하는지 알 수 있습니다.
DistanceToInnerCorner() 함수를 사용하여 좁은 채널의 회전 안쪽 모서리로부터의 최소 스플라인 최소 거리를 정의할 수 있습니다.
이전에는 부동 매개변수(distToBorder)를 테두리로부터의 거리 계산에 사용했습니다. channelWidth가 너무 작으면(distToBorder의 두 배 미만) 스플라인이 좁은 채널의 중간쯤을 통과하도록 이 거리가 릴랙스되었습니다. 이제 회전 안쪽에 있는 모서리와 스플라인 사이의 거리를 지정하는 구간별 연속(piecewise continuous) 아핀 함수를 channelWidth의 함수로 정의하여 이 릴랙스를 사용자 정의할 수 있습니다. 이 함수는 (0.0)에서 시작하는 폴리선으로 표현되며 여러 점을 통과하고 마지막 점 이후에는 균일해집니다 폴리선 점 [p0 - pn]을 제공하여 매개변수화됩니다. 처음 세그먼트를 (0,0)에서 p0까지 자동으로 가져오기 때문에 (0,0) 점은 제공되지 않습니다. 기본값은 단 한 점(0.4, 0.2)이 있으며 이는 기본값이 0.2인 단일 부동 distToBorder 매개변수처럼 작동합니다. channelWidth가 [0, 0.4]이면 선형 계수가 0.5인 선형이고 channelWidth가 0.4m보다 크면 0.2m로 균일해집니다
일반적으로 작은 channelWidth 값에 대해 낮은 선형 계수(예: y=x/10) 단면을 정의하는 데 사용된 다음 최대 거리로 y=x/2 어딘가에서 다시 결합합니다. 다음 그림을 참조하십시오.