길찾기엔진(PathEngine)에서 충돌오브젝트 등록

게임의 인공지능에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

길찾기엔진(PathEngine)에서 충돌오브젝트 등록

Post by 비회원 »

MMORPG를 개발중이며, NPC이동을 길찾기엔진(PathEngine)을 이용해 구현중입니다.
궁금한 것은 길찾기 메쉬에 충돌오브젝트를 어떤 방식으로 등록시키는 지 궁금합니다.
예를 들어 건물, 성문, 테이블 등등 월드에 등록시

현재 메쉬에 구멍을 뚫어 충돌오브젝트를 표현하고 있는데, 이는 디자이너들에게 너무 고생스러운 작업이라 다른 방법을 찾고 있습니다.

어떤 좋은 방법이 있는 지 다양한 조언부탁드립니다.
비회원

SDK 문서에 보시면 자세히 나옵니다.

Post by 비회원 »

Obstacles 라고 부르는데, SDK 문서에 잘 나와 있습니다. Max Export 규칙에 보면 적당한 Shape 로 표현할 수 있도록 되어있구요. - 메시에 구멍을 뚫는 것은 좋은 선택이 아닌 것 같습니다.
전외솔
Posts: 518
Joined: 2002-07-03 01:24

Post by 전외솔 »

PathEngine에서 메쉬에 구멍을 뚫지않고 장애물을 포함시키는 두 가지 방법이 있습니다.

1. iMesh 상에 정적인 장애물로 올려놓는 방법

- 맥스에서 넣는 방법

맥스에서 만들때는, 장애물이 될 오브젝트를 spline 계열의 convex polygon으로 생성하고,
이름앞에 'shape_'를 붙입니다.
spline계열의 z축과 평행인 line 메쉬를 만들고, 바닥메쉬와 앞서 만든 shape 를 동시에 꿰뚫도록 위치시킵니다.
이것의 이름은 'anchor_' 로 시작하도록 합니다.
바닥메쉬만 선택하고 익스포트하면 메쉬에 장애물이 추가된 것을 볼 수 있습니다.

- 코드에서 추가하는 방법

iMesh 로부터 iCollisionContext 를 생성하고,
장애물에 해당하는 모양을 iShape로 생성합니다.
iMesh::placeAgent 로 길찾기 에이전트를 생성하고
iCollisionContext::addAgent 로 추가합니다.
iMesh::burnContextIntoMesh 로 메쉬에 장애물을 등록합니다.
이후에 에이전트들은 모두 지워도 됩니다.

2. iMesh 상에 동적인 장애물로 올려놓는 방법.

1번에서 코드에서 추가하는 방법과 비슷하나,
burnContextIntoMesh할 필요 없이 그냥 agent로 사용하면 됩니다.
움직일 수도 있지만, 회전이 안된다는 단점이 있습니다.


참고로 mesh에 대한 모든 전처리는 이들 장애물 등록과정 이후에 이루어져야 합니다.

그리고 늘 그렇지만, 메뉴얼을 찬찬히 읽어보시면 필요한 정보들을 모두 발견하실 수 있으실 겁니다.
비회원

답변 감사합니다.

Post by 비회원 »

답변 너무 감사합니다. 메뉴얼을 더 찬찬히 봐야 하겠습니다. 다시한번 감사드립니다.

1. iMesh 상에 정적인 장애물로 올려놓는 방법

- 코드에서 추가하는 방법

iMesh 로부터 iCollisionContext 를 생성하고,
장애물에 해당하는 모양을 iShape로 생성합니다.
iMesh::placeAgent 로 길찾기 에이전트를 생성하고
iCollisionContext::addAgent 로 추가합니다.
iMesh::burnContextIntoMesh 로 메쉬에 장애물을 등록합니다.
이후에 에이전트들은 모두 지워도 됩니다.


질문사항:
동적으로 등록하면 회전할수 없다고 하셨지만,
정적으로 등록한다면 등록한 후 다시 Agent를 원하는 각도로 회전할수 있나요?
아니면 원하는 각도로 세우기 위해 iShape 값을 다르게 줘서 생성해야만 하는 건가요?
전외솔
Posts: 518
Joined: 2002-07-03 01:24

Post by 전외솔 »

제가 다뤄본 버젼은 5.02까지라 최근 버젼은 잘 모르겠습니다만,
어떠한 경우든 회전은 쉽지 않다고 보시면 됩니다.

패쓰 엔진의 알고리즘 상, 메쉬의 전처리과정에서, 장애물과 에이전트들의 모양에 대한 고려가
포함되기 때문에 이미 맵상에 올려진 장애물/에이전트 의 회전이 가능할 것 같지는 않습니다.
(확실한 것은 역시 제작자인 토마스 아저씨에게 물어보는 거겠죠.)

evaluation이 아니라 이미 구입을 하신 상태라면 토머스씨한테 메일을 보내서
"회전하며 열렸다 닫히는 문은 어떻게 구현하면 되죠" 같은 식으로 물어보시면 될 듯 합니다.


참고로 1번으로 적어드린 방법은, "장애물"로써 메쉬위에 추가가 됩니다.
(문서에서는 obstruction이라는 용어로 쓰입니다.)
그리고 장애물은 agent가 아닙니다. (움직이거나 할 수 없습니다.)
오히려 장애물은 맥스에서 디자이너가 'anchor_'로 박아넣은 것과 동일합니다.
(메쉬에 아예 박혀있다는 얘기죠.)
1번에 두번째 "코드에서 추가하는 방법"에서, 처음에 생성한 shape는
burnContextIntoMesh를 호출한 이후에는 agent와는 별개의 장애물로써 메쉬에 올려집니다.
(따라서 에이전트를 안지우고 움직인다고 해서 장애물이 따라 움직이거나 하지 않습니다.)


PS: 맥스에서 추가하는 방법에서 하나 빠졌네요.
shape 를 anchor에 링크해주고, anchor를 바닥메쉬에 링크해주어야 합니다.
비회원

같은 문제로 고민중인 사람입니다.

Post by 비회원 »

저도 지형메시에 못가는 부분을 구멍을 뚫어서 처리를 하고 있는데요..
작업량이 엄청 많아지더군요.

그런데 shape을 이용하자고 그래픽분께 건의를 드렸더니, shape의 경우 네임을 또 지정해줘야하니, 어떻게 보면 작업량이 별반 다를게 없다고 하시네요 ㅠㅠ;;;

먼가 획기적인 방법을 찾을 수가 없어서 요새 고민이 많습니다.
비회원

맥스에서 추가한 장애물이 이상해요.

Post by 비회원 »

PathEngine의 샘플에 코드로 추가한 baseObstacle의 경우, iMesh::burnContextIntoMesh() 실행하면
장애물로 등록이 길찾기 할때, 장애물을 피해서 잘 가더군요.

그런데 맥스에서, 추가한 baseObstacle이나 네임드 Obstacle의 경우에는 샘플에 올리고 테스트하면,
배치는 안되지만, 길찾기 실행시 장애물 역할을 제대로 못합니다.

맥스에서 익스포트 할때, 옵션이 잘못 된건지, 아니면 샘플 코드에 Obstacle 관련 코드를 추가 해야 되는지
모르겠네요.


참고로 샘플은 testpplication 프로젝트를 사용했습니다.
샘플에 testbed->drawBurntInObstacles() 코드를 추가하면 장애물은 분명히 로딩하고 있습니다.

맵툴에서 충돌체크해서 나무나 간단한 박스만 있는 경우는 자동으로 장애물을 익스포트 할려고 합니다.
혹시 더 좋은 방법을 사용하신분은 힌트라도 주시면 고맙겠습니다.
비회원

위에 질문 올린 사람입니다.

Post by 비회원 »

테스트 데이터를 잘못 만든것 같습니다.
샘플에서 장애물 설치 되어 있는 파일 로딩하니 잘되네요.
모두 퇴근 잘하세요.
Locked