farseer / box2d와 같은 2D 물리 엔진 내에서 AI 경로 추적을 어떻게 수행합니까?


12

나는 Farseer와 같은 적절한 강체 물리 엔진으로 작업하고있는 2d 하향식 게임을 옮기는 과정에 있습니다. 지금까지 필요한 곳에 물리 코드를 해킹했습니다.

나는 여기서 일을하는 올바른 방법을 배우려고합니다.

물리 엔진 내부에서 AI를 강체로 만들면 AI가 정해진 경로를 따르도록하는 올바른 방법은 무엇입니까?

AI에 따라야하는 내비게이션 노드 경로가지도에있는 경우 이전에는 다음 단계에서 다음에 있어야 할 위치를 계산하고 수동으로 해당 위치로 설정하여 경로를 따라 수동으로 이동합니다. .

그러나 이제는 강체이며 충돌 및 충돌로 인해 충돌 할 수 있습니다.

AI를 움직이기 위해 지금 그들에게 충격 / 힘을 가해 야한다고 생각합니까? 더 이상 수동으로 각 프레임의 위치를 ​​설정해서는 안됩니다.

그래서 나는 결정 론적 세계에서 AI가 비결정론 적 세계로 향하는 길을 엄격히 따라 가야 할 때 결정적인 세계에서 가야한다고 생각합니다. 움직일 수 있도록

맞습니까? 다른 사람들이 그렇게하는 방법입니까?

AI가 정확한 길을 걷고 있지 않기 때문에 AI가 풍경의 구석에 갇히는 것을 피하는 방법에 대한 몇 가지 질문을 제기합니다. 어떻게 이런 종류의 일을 처리합니까?

또는 어떻게 든 두 가지를 혼합하고 AI가 수동으로 위치를 설정하여 고정 경로를 따르도록하고, 쉽게 제어 할 수있는 특정 상황에서 다른 힘에만 반응하는 것이 더 낫습니까?

조언을 해주셔서 감사합니다.


1
+1 나는 또한 이것에 대해 배우고 싶습니다.
David Gouveia

답변:


7

조향 행동 은 일반적으로 "조향력"을 반환하는 방식으로 구현되어 물리 엔진에 적용될 수 있기 때문에 물리 엔진과 함께 사용하면 매우 효과적입니다.

장치가 경로를 따르도록하려면 찾기 를 사용 하여 경로 노드에서 경로 노드로 이동 한 다음 (오버 슈트를 피해야 함) 경로의 마지막 노드에 도착 을 사용 하십시오.

막히는 것에 대한 귀하의 우려에 관해서 : 힘을 사용하여 경로 추종을 모델링하는 것은 실제로 매우 정확해야합니다. 객체가 다른 객체와 충돌하는 경우 경로에서 객체가 튕겨 나올 수 있지만, 매번 업데이트 할 때마다 조향력을 계산하므로 객체가 즉시 다시 궤도에 있어야합니다. 충돌 후 경로와의 편차가 잠재적으로 클 수있는 경우 충돌이 발생할 때마다 마지막 위치를 기억 한 다음 정상 경로를 계속하기 전에 객체를 마지막 위치로 다시 조종하는 것이 좋습니다.


놀라운 기사, 공유해 주셔서 감사합니다. 내 하루를 구했다.
Ricardo Sanchez-Saez

0

나는 당신이 올바른 길을 가고 있다고 말하고, 당신은이 기사를보고 싶을 것입니다 :

http://www.policyalmanac.org/games/aStarTutorial.htm

A * 알고리즘을 사용하여 기본적인 충돌 방지 및 경로 찾기에 대해 설명합니다.

편집하다:

올바른 방향으로 물체를 추진하는 가장 좋은 방법이 정말로 필요한 경우, 경로 찾기 알고리즘을 사용하여 찾은 최고의 경로 방향을 가리키는 힘 (예 : MovementForce 또는 무언가)을 사용해야합니다. 선택


나는 그 기사가이 질문과 관련이 있다고 생각하지 않습니다. OP는 두 위치 사이에서 최적의 경로를 찾는 방법을 묻지 않고 물리 시뮬레이션의 맥락에서 액터가 이미 계산 한 경로를 따라 가도록하는 방법을 묻습니다.
David Gouveia

내가 읽을 때 잘 다시 나는 당신의 점, 아픈 편집을 참조 내 대답
annonymously

:) 제목을 변경하여 내용을 정리했습니다. 경로를 찾는 것이 아니라 경로를 따르는 데 확실히 관심이 있습니다.
TerryB

0

@davidluzgouveia가 annonymously의 게시물에 대해 언급 한 내용으로 판단하여 프로젝트를 시작합니다. 경로 추적과 경로 찾기는 매우 다릅니다. 경로 찾기는 대담하게 게시 한 내용보다 많으며 경로 찾기를 위해 Dijkstra의 알고리즘을 살펴볼 것입니다. 경로 추적을 위해 나는 선택한 물리 엔진을 전적으로 사용합니다. 내가 설정 한 방법은 단위 클래스가 걷는 각 위치가 2D 오프셋을 통해 하위 클래스 경로에 설정되어 있다는 것입니다. 그렇습니다 .2D이며 3D가 아닙니다. .

3D 설명 : 각 유닛에는 지형 및 월드 오브젝트와의 충돌을 위해 독점적으로 설정된 하나의 메인 콜 라이더가 있습니다. 캡슐 모양이며 프로그램 적으로 말하면 반경과 높이가 있습니다. 모델의 중심에 지어졌으며 모델의 앞쪽과 위쪽을지나 확장되어야합니다. 그러나 나는 또한 지상에서 항상 얼마나 멀리 떨어져 있는지에 대한 표면 오프셋과 한 번에 약간 튀어 오르기 전에 미끄러질 수있는 양의 부유물을 가지고 있습니다. 지형 충돌 문제에 대해 일종의 고정 수정을 적용하는 것처럼 들리지만 이유가 있습니다.

어쨌든이 캡슐 물체에 힘을 가해 야하며 항상지면 위에 떠 있어야합니다. 그것은 더 이상 갈 수 없다고 말하는 것이 아니며 더 이상 갈 수 없다는 것입니다. (제 경우에는) 호버링해야하는 이유는 강체와 래그 돌 물리 엔진에서 유닛의 다리가 절차 적으로 애니메이션되기 때문입니다. 따라서 캡슐에 간단한 힘을 가하면 제 몸의 다리가 스스로 위치를 바꿀 것입니다. 그들은 또한 별도의 중력 응용 프로그램을 갖습니다! 이것이하는 일은 내 캐릭터가 기울어 진 경우 한 발이 다른 발보다 더 낮을 수 있다는 것입니다.

이것이 바로 당신이 해야하는 방법입니다. 당신이 묻는 것에 의해 판단하십시오. 일부 기능을 사용하지 않으려는 경우 특히 RTS 또는 FPS이고 아무도 발을 보지 못하거나 돌보지 않는 경우에 좋습니다. 그러나 일반적으로 유닛에는 캐릭터의 움직임과 거의 독점적으로 작동하는 하나의 MAIN 충돌 오브젝트가 있어야합니다.

구체적으로 2D : 엔진이 움직이기위한 주요 지점 또는 일종의 기준이 여전히 있어야합니다. 각 유닛에 필요한 몇 개의 위치가있는 경로 지정 서브 클래스를 제공 할 수 있습니다. 레벨 코드에서 지정할 수 있습니다 (예 : location1 (x, y) location2 (x, y) 등). (작업중인 게임 종류를 모름) 레벨에서 위치를 지정하고 각 단위가 레벨에 지정된 순서대로 처리하고 각 위치에 도달 한 후 원하는 위치를 다음에 도착해야합니다.

각 유닛의 첫 번째 위치에 위치 목록이있는 것처럼 모든 단위가 동일한 위치로 이동하지 않아도되기 때문에이를 수정할 수있는 방법이 많이 있습니다. 그러나 같은 방법으로 레벨 코드에서도이를 수행 할 수 있습니다 (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) 도대체 무엇이)

몇 가지 아이디어! 관련성이 적지 만 3D 버전을 읽는 것이 좋습니다.

편집 : 나는 이것을 읽을 수있는 사람을 위해 두 가지를 모두 공급하기로 결정했습니다 (그렇습니다 사실) .... (나는 원래 당신의 질문을 훑어 보았고 그것을 다시 읽을 때까지 꽤 2D 특정하다는 것을 알지 못했습니다.>)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.