경로를 따라 걷는 동안 캐릭터가 매끄럽게 변하는 방법 (좌표 목록)?


15

좌표가있는 목록이 있습니다-A * 알고리즘에서 출력-문자가 회전 하면서이 경로를 부드럽게 따르도록하고 싶습니다.

그래서 나는 A 와 같은 것을 가지고 있고 C 를 얻고 싶습니다.

여기에 이미지 설명을 입력하십시오

어떻게해야합니까?

편집하다

나 자신을 좀 더 명확하게하려면 :

한 노드에서 다른 노드로 이동하는 방법을 이미 알고 있기 때문에 부드러운 회전에 더 관심이 있습니다.

편집하다

많은 사람들이 이것이 유용하다는 것을 알았을 때 나는 Daniel Shiffman의 "Nature of code"링크를 게시하여 많은 게임 AI (물리학) 문제, 예를 들어 스티어링 행동 http://natureofcode.com/book/chapter- 6 자율 에이전트 / # chapter06_section8


Unity에 길 찾기가 내장되어 있지 않습니까?
joltmode

@Tom 음 그래도 어쨌든 내 버전을 구현했습니다. 이 질문의 요점은 길을 걷는 동안 부드러운 회전 (회전)을 얻는 것입니다.
Patryk

3
이와 관련하여 Google의 좋은 용어는 'Steering Behavior'입니다. :)
Roy T.

3
@RoyT. 물론이야 ! 나는이 몇 주 전에 읽고 이미 잊었되었습니다 /이 멋진 수학 + 물리 설명과 함께 다음 경로에 큰 기사입니다 natureofcode.com
Patryk

1
나는 링크에 대해 @Patryk에게 감사하고 싶었다. 정말로 유익한 것처럼 보였고, 스티어링 행동에 대한 좋은 자료를 찾고 있었다.
Christian

답변:


7

타일 ​​기반 환경에서 부드러운 패스를 원한다면 A * 웨이 포인트에 패스 스무딩 을 적용 할 방법이 없습니다 . Matt Buckland는 프로그래밍 게임 AI에 관한 책 에서 경로를 매끄럽게 하는 간단하고 빠른 알고리즘 을 설명합니다 (기본적으로 장애물과의 교차를 유발하지 않고 제거 할 수있는 모든 가장자리를 제거합니다).

이와 같이 불필요한 모서리를 제거하면 첫 번째 경우 ( A-> B )가 해결됩니다. 그래프의 가장자리를 다듬는 방법은 여러 가지가 있습니다. 대부분의 경우, 에르 미트의 스플라인 (당신의 장애물 밀도와 타일 크기에 조금 따라) 작동합니다. 또 다른 옵션은 조향 행동 일 수 있으며, 현재 목표에서 타일을 반만 떨어 뜨리 자마자 다음 웨이 포인트로 향하기 시작합니다 (이것은 실제로 "에이전트"의 이동 / 회전 속도에 달려 있습니다).


9

다른 사람들이 언급했듯이, 두 번째 경우에는 일종의 스플라인을 구현해야하거나 (실제로는 예에 더 잘 맞음) 장치에 일종의 조향 동작을 부여해야합니다.

그러나 첫 번째 경우 경로 스무딩보다 더 간단하고 더 나은 결과를 제공하는 솔루션이 있습니다. 그것은 Theta * 라고 불리우며 , 그리드에서 유닛이 그리드 포인트 사이에서 어떤 방향 으로든 움직일 수있게하는 그리드에서 A * 의 단순 하고 비교적 확장 된 것입니다.

세타 * 대 경로 스무딩

Theta * (위의 이미지를 훔친 것)를 설명하는 멋진 기사가 있습니다.


2

보다 인간적인 사실적인 움직임을 위해 조향 동작과 통합 해보십시오. (클래식 OpenSteer의 C # 버전 http://sharpsteer.codeplex.com/ ) AStar 의 결과물을 얻고 스티어링 행동이 운동에주의를 기울 이도록합니다 (샘플 중 하나가이를 수행하는 방법을 정확하게 보여주고 경로를 따라 탐색합니다)


1

지점 간 탐색의 경우 각도 차이 (현재 플레이어 방향 대 현재 지점에서 다음 지점으로의 방향)를 사용한 다음 움직임이 발생함에 따라 각도를 최종 각도로 점차 변경했습니다. 이 게임을 확인 여기 비행기가 다른 한 지점에서 이동하지만 차례 갑작스러운하지만 경로의 지점을 식별 할 수 조심스럽게 하나를 시청에없는입니다. (이 게임은 iPhone / iPad가 바람직하지만 모바일에서만 작동합니다).


이것이 바로 내가 한 일입니다.
Patryk

1

나는 Catmull-Rom 스플라인 과 행운을 빕니다 (@bummzack에서 권장하는 큐빅 스플라인 유형)을 사용하여 얻었습니다. 이것에 대한 좋은 부분은 스플라인이 항상 제어점을 통과한다는 것입니다. 다른 많은 사람들은 그렇지 않습니다. 다음과 같이 구현하십시오.

t    = <time*>
t12  = t + 1.0
t23  = t
t34  = t - 1.0
t123 = (t + 1.0) / 2.0
t234 = t / 2

c1 = controlpoint[0];
c2 = controlpoint[1];
c3 = controlpoint[2];
c4 = controlpoint[3];

l12 = lerp(c1, c2, t12);
l23 = lerp(c2, c3, t23);
l34 = lerp(c3, c4, t34);
position = lerp(lerp(l12, l23, t123), lerp(l23, l34, t234), t);

* 시간 은 제어점 1과 2 사이의 값 [0,1]입니다.


0

그리드 대신 내비게이션 메시를 사용하여 A-> B를 해결할 수 있습니다. 이는 길 찾기 데이터 생성에 큰 변화가 있음을 의미합니다.

C와 D와 같은 경우는 모서리를 자르는 것입니다. 캐릭터가 경로에서 "코너"(이전, 현재, 다음 셀이 직선이 아닌 셀) 내부로 이동하는 경우 이전 및 다음 셀 방향으로 밀어 넣으십시오. . 유일한 문제는 실제 위치와의 거리 (밀기 거리)를 결정하는 것입니다. 아마도 입력으로 현재 셀과의 거리가 필요할 것입니다. 이 같은:

push_dir = average( prevcell.pos, nextcell.pos ) - curcell.pos;
push_dist = cell_half_width - distance( char.pos, curcell.pos );
char.pos += push_dir * push_dist;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.