본문 바로가기

관심분야/게임

시야관리 - 또 다른 관리 방식: Viewport~

온라인 게임에서 시야란.. 데이터 처리를 위한 것과, 처리된 데이터를 받아야 하는 객체를 관리하는데 가장 큰 목적이 있다. 그런데 문제는 데이터를 받아야 하는 객체의 수가 증가 한다는 것이고,

이를 위해, 시야를 근거리~원거리로 분리하여 관리하는 방법을 소개 하였다.

사용자 삽입 이미지
이번에 고민하는 부분은 데이터를 받아야 하는 객체가 실제로 필요로 하는 데이터를 걸러내기 위한 방법이다.

기존 방식의 객체가 View(보고 있는)하는 범위의 객체 뿐만 아니라 보고 있지 않는 음영에 존재하는 객체에게 까지 데이터를 전달한다는 것이다.

만약, O 라는 객체의 Viewport가 B' 방향으로 향하고 있다면 음영(뒷쪽)에 있는 객체의 정보 중요성은 낮아지게 된다.

다른 객체로 부터 데이터가 발생이 될때 O 객체의 뒷쪽에 존재한다면 이동 목적지가 자신의 시야에 존재하지 않는 경우와 O 객체에 영향을 미치지 않는 데이터(공격 등)인 경우는 무시 할수 있다는 것이다.


정리하면, 다른 객체의 정보가 O 객체에 전달되어야 하는 데이터는

   1. O 객체의 시야로 이동되는 다른 객체의 이동
   2. O 객체를 공격 하는 등의 행위 데이터
   3. 그외 O 객체에 영향을 미칠수 있는 데이터


이외의 데이터는 전달(전송)될 필요 없이 서버상에서만 업데이트를 하면 된다~

이러한 처리는 기존에 소개된 시야 관리 방식을 대신하여 사용될수 있다.

영역에 대해서 설명을 해 보면,
   A영역은 O 객체의 근접 시야 범위
     : A영역을 O 객체 중심으로 계산 하는 이유는 O 객체 뒤의 타 객체가 O 객체의 시야 안으로 들어 올경우
       대비하기 위해서 이다.

   B영역은 O 객체가 B' 방향으로 바라보고 있는 원거리 시야 범위
이를 위해, B 영역은 A영역 밖을 중심으로 하여 시야 범위를 계산하여야 한다.

Checkpoint.
   1. A 영역의 크기
      : 서버와 통신 시간 사이에 타 객체가 시야 안으로 들어오는 경우의 처리를 위해 최소 크기를 결정해야 한다.
   2. B 영역의 크기
      : 시야의 크기가 너무 넓을 경우 오히려 역 효과가 날수도 있다.
      : B의 크기를 계산하기 위하 B'가 O의 위치로 부터 얼마나 떨어져야 하는지..

구현에 대한 부분은 이후 고려해 볼수 있다.

필요한 3D 연산 공식 (공식의 오류가 있다면 리플 부탁 드립니다)

   - 현재 위치(x,y,z), 객체가 보고 있는 방향에 대한 회전값(r), 목표 위치를 계산하기 위한 거리(n) 값이 존재
     : 이 값을 기준으로 목표 위치를 생성해야 한다는 문제를 풀어야 한다.
     : 참고로, z 값은 무시해도 무방할듯 하다.. --;

     * 회전값은
        T = 목표위치 - 현재위치
       회전값 = atan2( T.y, T.x); // 0 ~ M_PI
        이러한 방식으로 클라이언트에서 계산됨을 나타낸다.

        각도로 회전값을 구하기 위한 공식은
      회전값 = 각도 / 180.0 * M_PI
        가 된다.

   - 공식을 보면,
     vector3D T;

     T.x = cos(회전값) * 거리;
     T.y = sin(회전값) * 거리;
     T.z = 0;
    return 현재위치 + T;
    를 통해, 위치 값을 얻어서 B 영역의 중심점을 얻을 수 있다.


Viewport 방식으로 구현함에 있어 기존의 처리 방식(O객체 중심의 시야 관리)에 비해, 상대적인 객체 관리가
유연하다는 장점이 있지만, 반대로 이러한 장점이 단점이 된다.

객체가 보는 시야를 중심으로 관리하기 때문에, 이동 및 전투시 시야의 변경이 자주 발생 될수 있다는 것이다.
  - 이렇게 변경될 경우 시야의 변경 각도가 일정 각도 이상일 경우 시야 정보를 매번 재 구성해야 한다는
    문제가 있다. = 여기에서 재 구성 해야 하는 시야는 O 객체 중심이 아닌, B' 중심으로 구성된 시야의
    범위이다.

이 부분에 대해서는 실제 효율적인 측면으로 접근할 필요성이 있다.
   * 게임을 즐기는 사용자 입장에서 플레이어는 일정 방향으로 달리거나 (진행 방향 = 시야로 접근 가능),
     전투시에는 B' 시야가 아닌 자기 잔신을 중심으로 하는 근접 시야를 사용하기 때문에,

  * B' 중심의 시야 재구성에  중요성은 낮아 질수 있기 때문이다.

참고가 되었길~