난 이 영상 보고 아래 나온 내용대로 ai를 짜봤어.
먼저 context_dir 이라고 하는 배열을 둬서 그 안에 각 방향에 맞는 길이가 1인 벡터를 넣었어.
그 다음에 '플레이어로 향하는 벡터'랑 context_dir 안 벡터의 도트곱을 구해서 영상과 같이 context map을 만들었는데,
결과적으로 영상에서 나오는 결과랑 비슷하게 나왔어.
초록색 점이 쫓을 대상, 빨간색 점이 피할 대상이야.
영상에서는 제작자가 '피할 대상'이랑 '쫓을 대상'에 해당하는 도트곱 값을 어떤 식으로 context map에 더했는지 잘 모르겠어서
그냥 거리를 나누고 둘이 더했어.
other.context_map[i] += (1.0 - abs(dot - 0.65)) / dist; // 피할 대상
other.context_map[i] += (1.0 - (dot)) / dist; // 쫓을 대상
이런식으로 모든 고려할 오브젝트 도트곱 값을 더한 뒤에 방향에 따른 context_map 값중 가장 큰 값을 나눴어.
for(var i = 0; i < ray_count; i++){
context_map[i] /= maxval;
}
이렇게 구해서 몬스터 ai에 적용해봤는데, 구체적으로 두 개 정도 큰 문제가 생기더라고.
1. 피할 대상 or 쫓을 대상이 너무 많아서 메모리 소모가 너무 커.
2. 피할 대상이 너무 많아지면 쫓을 대상을 제대로 못 쫓아.
위 사진처럼 방향을 정하는 데 문제가 있더라고.
혹시 Context map으로 몬스터 알고리즘 만들어본 사람 중에 나랑 똑같은 문제에 빠진 사람 없는지 궁금해서 찾아왔어.
영상 제작자가 참고했다는 논문도 한 번 읽어 봤는데
메모리를 너무 많이 소모하는 건 각 Context_map에 해당하는 방향으로 레이캐스팅해서 피할 대상이 있는지 확인해서
그쪽 방향을 차단하는 방식이 있더라고. 그 방법 그대로 해봤을 때 장애물을 피해서 쫓을 대상을 잘 쫓긴 하는데
몬스터 피할대상 쫓을대상
이렇게 일직선 상에 피할대상, 쫓을대상 둘 모두 있을 때에는 제대로 작동을 안하더라고.
혹시 충고해줄 내용이나 찾아봐야 될 정보들 힌트라도 줄 수 있을까?
코드 알려저...내가 올린 영상이야..
해당 댓글은 삭제되었습니다.
구체적으로 몬스터 피할대상 쫓을대상 이렇게 위치해 있을 때 몬스터는 위나 아래로 움직이게 되는데 몬스터 피할대상 쫓을대상 이런식으로 몬스터가 위로 가면 Context map에서 최대 크기를 가진 벡터가 아래쪽을 향하는 벡터로 바뀌어. 문제는 이게 틱 단위로 아주 조금 움직여도 생기는 문제라 지터링같이 움직임이 꼬이더라고. 일단 좌측, 우측 둘중 하나만 골라서 움직이게 해보고 올게. 답변 고마워!!
나도 비슷하게 구현은 했는데 니랑도 동영상이랑도 안비슷하네 ㅋㅋ
나같은 경우 거리는 쫓아야할 타겟 거리 / 피할 타겟 거리 해서 나온 값을 피하는 웨이트에 곱해주고 있음. 이러니까 피할 타겟에 둘러쌓인 막짤 상황에서 그냥 쫓을 타겟을 선택하게 됨
몬스터 피할대상 쫓을 대상 일직선 겹칠때만 예외처리 하는건 어떰
최적화는 ㄹㅇ 문제네 이터레이션이 몇번이야; 몬스터 머릿수까지 따지면..
구현할 때 쫓아야할 타겟이랑 피할 타겟 전체에 대해 Context map 값을 구했어? 만약에 레이캐스팅 안하고 Context map 값에만 의존해서 하면 최소 가동 범위 내에 있는 타겟에 대해서만 이터레이션 하면 양이 확 줄긴 할 것 같은데 레이캐스팅이랑 비교했을 때 뭐가 더 부드럽게 나올지 잘 모르겠네.. 일단 말해준 웨이트 값 정하는 방법 써서 다시 해보고 올게. 답변 고마워!!