Hyun2and
9. AI Part 2 본문
728x90
서론
지금까지
- input, 시뮬레이션
- 게임월드
- 랜더링 - 애니메이션
- 네트워크
지난시간
- 게임에서의 AI
- 지능적인 행위를 컴퓨터가 시뮬레이션한다
- 지능적인 것? 규칙이 있고, 규칙, 주변 상황에 따라 이루어진다
- 주변 상황을 파악하는 것이 필요하다
- 주변 상황에 상관없다면 그냥 로봇이다
게임에서의 AI
- 추가적인 고려사항 : 성능! 성능이 빨라야한다
- AI 가 느리면 게임 월드에 반영이 느려지고, 반응성이 떨어질수록 플레이어가 반응하기 쉬워지면서 재미도 떨어진다
- 성능이 중요하다. 조금 덜 지능적이더라도 빠른것이 중요하다
- 외관상 그럴듯하면 된다
- 수준에 따라 범위를 제한한다
AI 의 종류
AI for Agent
- 하나를 컨트롤한다
- 구성요소
- 센서 : 주변의 정보를 파악한다
- 메모리 : 새로운 정보를 비교하기 위한 데이터
- 리즈닝 코어 : FSM(순서적인것) , RuleBasedSystem(병렬적인 상태. 충돌이 발생할 수 있다)
- 액션 시스템
- 개별적인 컨트롤러. 주변 AI와 같은 행동을 하려면 센서나 메모리를 주고받아야 한다
AI for Strategy
- 전체를 컨트롤한다
- 월드, 그룹 행동behavior을 컨트롤한다
- 전체적인 Goal, Abstract Controller 를 가진다
Action Game 예시로 배워보자
- 저격수
FSM을 쓴다
- 경계, 적 발견, 공격 상태 등으로 구분한다
- 아래 그림처럼 구성할 수 있다
- 이제 이걸 어떻게 구현할까?
1. Choreographed AI 로 구현해보자
- 반복적인 행동을 하는 AI에서 사용한다.
- 로봇, 엘레베이터
- 코너에 있는 State, 이동, 응대 하는 State가 있으면, 사람이 없으면 계속 이동하고, 사람이 있으면 이동 멈춘다. 사람이 근처에 있으면 응대한다. 이 시나리오가 반복된다
- 이 경우엔 if문을 써서 그냥 구현하면 된다
- 현재 이동 상태라면, 근처에 사람이 있는지 판단하고 정지한다
- 아래처럼 스크립트로 구현할 수 있다
if(state == CORNER) { 90도 회전 state = MOVE; } if(state == MOVE ) { if(사람이 근처에 있으면) { 정지 state = 응대; }else if(코너면) {state = CORNER;} else 이동 } if(state == 응대) { 사람의 질문을 기다린다 사람의 답을 기다린다 if(사람이 근처에 없으면) state = MOVE; }
FPS 를 기준으로 세부적인 부분 구현하기
Tracking
1. Object Tracking
- 목표 : 물체를 추적한다 . 조준한다
- 움직이는 것에 맞춰서 계속 쫓다가 특정 지점의 방향을 가리킨다
- 가장 최소한으로 움직이면서 타겟이 움직였을 때 계속 쫓아가야 한다.
- 움직이는 시점으로부터의 최적의 회전량을 구한다!
- 2차원인 경우의 회전
- 원래의 방향과 이후 방향의 두 직선을 통해 각도를 구한다
- 어떤 방향으로 회전할지 결정한다 (안쪽으로? 바깥쪽으로?) sin, cos 값을 통해 180도, 90도보다 큰지작은지 알 수 있다
- 총 등의 방향을 회전시킨다
- 3차원인 경우
- 2 DOF 회전 : 2개의 축을 두는 회전을 하게된다. 구 위에서 회전하는 것.
- 쿼터니안(Quaternion) 을 써서 계산한다
- Unit 쿼터니안은 회전량과 스칼라 값을 가진다
- 회전축 : 원래방향, 이후방향이 만드는 평면의 수직벡터가 된다. 두 벡터의 외적.
- 회전량 : 두 벡터의 내적을 크기로 나누면 cos세타. 외적을 나누면 sin세타가 나온다. 이를 통해 코사인, 사인을 통해 쿼터니안을 회전시킨다
- 게임엔진에서 회전할 때는 쿼터니안, 오일러(x,y,z축으로 몇도로 회전할지?) 두 방법중에서 쓰지만, 쿼터니안 쓰는게 더 좋다
- 2차원에서는 오일러로 몇도! 이렇게 표현하는게 더 좋을수도 있다
- 적이 너무 빨리 움직이면 따라잡지 못하기때문에 그 부분에서의 시뮬레이션도 필요하다
2. Chasing
- 목표 : 타겟이 움직이면 나도 따라 ‘움직인다’
- 바라보면서 타겟과의 거리를 줄여가는 것
- 회전 + 그 방향으로 움직인다
- 실제로는 플레이어 위치로만 움직이면 플레이어 위치가 바뀌기때문에 못잡는다
- 플레이어의 진행값을 예측해서 어느정도 오차 값을 둔다 (적을 피하려면 지그재그같은 랜덤으로 움직이는 것이 예측불가능한 것)
- Predictive Chasing
- 이전의 움직임으로부터 그 다음 위치를 예상한다
- 플레이어의 움직임 벡터 = (현재 위치-이전위치)
- 동일한 벡터 상으로 움직일 것이라고 예측한다
- 이 움직임 벡터로 다음 위치를 추정하여 이동한다
- 그 포지션을 조준한다
- 이동한다
- 이전의 움직임으로부터 그 다음 위치를 예상한다
- 2차 fitting, kalman filter(관성체의 움직임을 예측한다) 등을 이용해서 구현할 수 있다
Moving
1. Evasion
- 적이 있고, 내가 있을 때 적이 나를 쫓아올 때 도망가는 것
- chasing 의 반대. 예측이 없다면 상대를 바라보고 다가가는 것이 아니라 반대로 가는것
- 예측이 쉽다
- 쫓아오는 값을 예측해서 반대로 간다
- 예측을 어떻게 할까? 조금 복잡해진다
- 경로를 예측하고 수직으로 가장 먼 방향으로 도망친다
- chasing 처럼 예측, 에임, 이동 똑같지만 예측 식만 다르다
2. Patrolling
- 일정 일련의 경로 waypoints들 구간을 순차적으로 방문한다. 이 과정을 반복한다.
- 이것도 chasing 을 활용할 수 있다. 상대를 aiming 하는것이 아니라 다음 waypoints를 조준하면 된다
- 적이 나타나면 적을 chasing하다가 적이 사라지면 다시 waypoints를 조준하고 이동한다
Special Actions
1. Hiding and Taking cover
- 타겟이 나를 바라보지 못하게 한다
- 타겟이 나를 aim,chase 하지못하게 해야한다
- 단계
- hiding place 를 찾아야 한다 (내 몸 전체가 가려질 수 있어야한다)
- 그 위치로 이동한다
- 아이디어
- 가장 가까운 오브젝트를 찾아야 한다
- 적의 시야로부터 가려져야 한다
- 그쪽으로 이동한다
- 어떻게 구현할까?
- 현실적으로 AI 설계보다도 룰을 위한 컨디션 계산이 가장 어렵다.
- 절차
- 가장 가까운 오브젝트를 찾는다
- 월드 공간을 일정하게 분리한다. 그 분리된 공간 중 가장 가까운 공간을 찾는다
- 정사각형으로 나눠도 되지만 가로세로로 어디로 나눌지 결정하기 어렵다. 주변을 다 봐야한다
- 정육각형으로 나눈다. 가로세로의 차가 더 작기때문에. 그 후 반드시 앞에 있는 물체만 찾는다.
- 물체가 길게 되어있는 경우는, 중점이 아닌 바운딩 박스의 끝점들을 기준으로 계산한다 (sphere에는 빈 공간들이 있기 때문에 계산은 쉽더라도 박스를 쓴다)
- 숨을 수 있는지를 판단한다
- 숨은 오브젝트의 꼭짓점과 플레이어로부터 모두 ray 를 쏜 후 내 오브젝트와의 ray 가 이 ray들의 각도 범위 내에 있다면 숨을 수 있다는 것이다. 계산이 복잡하다
- 오브젝트들을 나의 구체 반지름 r만큼을 줄이더라도 남는 공간이 있다면 숨을 수 있다. 계산 자체는 모호해도 그럴듯하다.
- 로봇의 크기가 r일때 지나갈 수 있는 경로를 찾는 문제와 비슷하다. 전체적으로 r만큼 줄여서 생각한다
- 해당 오브젝트로 움직인다
- 가장 가까운 오브젝트를 찾는다
2. Shooting
- 레이저 건인 경우
- 일직선으로 날아가는 구체의 경우
- aiming 하고 쏘면된다
- 움직이지 않는 상태에서 총알을 날린다
- ‘물체가 움직이고 있는지 판단하고 움직이지 않으면’ 포물선으로 날린다
- 판단한 후 aiming해서 쏘면된다
- 스나이퍼
- 총알이 날아가는 시간을 대략적으로 판단한다
- 적이 움직이고 있기 때문에 적의 다음 위치를 예측해서 쏜다
- chasing 활용해서 쏘면된다
- action 클래스는 aiming, chasing 을 기본적으로 활용해서 상속 → 추가 구현하면 된다
최종 구현
그룹 행동 조정
- sharedmemory 나 flag 를 두고 작동하도록 한다
- 병렬 오토마타에 대해 행동하도록 한다
- command 를 하는 AI(전략 AI) 에 의해 그룹 안의 AI들이 모두 공격상태가 되는 것이 중요하다
정리
Action AI
- Geometric sensor 공간적으로 센서계산이 중요하다
- Controlled behavior 하드코드로 행동을 정의한다
- Devise the behavior 상태-상태 간의 행동 케이스들을 정의하고 구현한다
728x90
'공부엔 끝이없다 > 이것저것' 카테고리의 다른 글
11. Animation (0) | 2023.03.20 |
---|---|
10. Tactical AI (0) | 2023.03.20 |
Euler vs Quaternion (1) | 2023.03.20 |
Comments