Hyun2and

9. AI Part 2 본문

공부엔 끝이없다/이것저것

9. AI Part 2

혀니앤 2023. 3. 20. 22:56
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

  1. 레이저 건인 경우
    • 일직선으로 날아가는 구체의 경우
    • aiming 하고 쏘면된다
  2. 움직이지 않는 상태에서 총알을 날린다
    • ‘물체가 움직이고 있는지 판단하고 움직이지 않으면’ 포물선으로 날린다
    • 판단한 후 aiming해서 쏘면된다
  3. 스나이퍼
    • 총알이 날아가는 시간을 대략적으로 판단한다
    • 적이 움직이고 있기 때문에 적의 다음 위치를 예측해서 쏜다
    • 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