게임 수학의 극좌표계

이 기사는 수학 게임 Advent Calendar 2018의 6 일째 기사입니다.

올해 CEDEC의 여기 공연이 계기로 최근 DirectX를 다시 공부하고 있는 게임 회사에 근무하는 엔지니어입니다.
DirectX 12를 조용히 진행하고 있었는데, 게임 수학 Advent Calendar가 비어 있다는 것을 알고, 하고 있던 것의 되돌아보기도 겸해, 기사를 투고하겠습니다.

이 기사의 대상자


  • 과학 프로그램을 기억하고 싶은 분

  • 평소부터 과학 프로그램을 작성하는 CG 엔지니어에게는 볼 필요가 없습니다.

    주제



    이번, 이야기하는 내용은, 극좌표계에 대해입니다.
    수식은 이것입니다.
    x = r sinΘ * cosφ
    y = r cosΘ
    z = r sinΘ * sinφ
    

    r 은 중심으로부터의 거리. Θ와 φ는 각각 다른 각도입니다.
    y 와 z 가 역으로 되어 있는 해석도 있습니다만, 제 경우에는 이것으로 가르쳤습니다.

    그럼, 이 극좌표계가, 무엇에 사용할 수 있을까? 이런 사례를 소개하겠습니다.

    정이십면체 만들기



    sphere를 계산에 의해 작성할 수 있습니다.
    아래 이미지는 프로그램에 의해 정이십면체를 작성한 실행 결과입니다.



    정이십면체이기 때문에, 정확하게는, sphere는 아니지만, 약간의 디버그 기능으로 Collider를 표시하고 싶을 때에, sphere의 Mesh를 로드하는 것은 물론 없는 생각이 듭니다.
    이 의사 sphere는, 프로그램으로 생성하고 있기 (위해)때문에, 정점수나 면수등을 줄이거나 Line만으로의 draw로 하는 일도 가능합니다.

    실제로 표현식을 사용하는 프로그램은 다음과 같습니다.
    //---------------------------------------------------- 
    // 極座標で正N面体を作る
    //----------------------------------------------------
    #define N = 20
    
    Vertex triangleVertices[N * N * 3];
    int herf_n = N / 2;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < herf_n ; j++)
        {
            float radian = 2.0f * XM_PI / N;
            int index = i * 6 * herf_n + j * 6;
            triangleVertices[index].position.x = SPHERE_RADIUS * sinf(radian * j) * cosf(radian * i);
            triangleVertices[index].position.y = SPHERE_RADIUS * cosf(radian * j);
            triangleVertices[index].position.z = SPHERE_RADIUS * sinf(radian * j) * sinf(radian * i);
            triangleVertices[index].color = XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f);
    
            triangleVertices[index+1].position.x = SPHERE_RADIUS * sinf(radian * j) * cosf(radian * (i+1));
            triangleVertices[index+1].position.y = SPHERE_RADIUS * cosf(radian * j);
            triangleVertices[index+1].position.z = SPHERE_RADIUS * sinf(radian * j) * sinf(radian * (i+1));
            triangleVertices[index+1].color = XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f);
    
            triangleVertices[index+2].position.x = SPHERE_RADIUS * sinf(radian * (j+1)) * cosf(radian * i);
            triangleVertices[index+2].position.y = SPHERE_RADIUS * cosf(radian * (j+1));
            triangleVertices[index+2].position.z = SPHERE_RADIUS * sinf(radian * (j+1)) * sinf(radian * i);
            triangleVertices[index+2].color = XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f);
    
            triangleVertices[index+3].position.x = SPHERE_RADIUS * sinf(radian * (j+1)) * cosf(radian * i);
            triangleVertices[index+3].position.y = SPHERE_RADIUS * cosf(radian * (j+1));
            triangleVertices[index+3].position.z = SPHERE_RADIUS * sinf(radian * (j+1)) * sinf(radian * i);
            triangleVertices[index+3].color = XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f);
    
            triangleVertices[index+4].position.x = SPHERE_RADIUS * sinf(radian * j) * cosf(radian * (i+1));
            triangleVertices[index+4].position.y = SPHERE_RADIUS * cosf(radian * j);
            triangleVertices[index+4].position.z = SPHERE_RADIUS * sinf(radian * j) * sinf(radian * (i+1));
            triangleVertices[index+4].color = XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f);
    
            triangleVertices[index+5].position.x = SPHERE_RADIUS * sinf(radian * (j+1)) * cosf(radian * (i+1));
            triangleVertices[index+5].position.y = SPHERE_RADIUS * cosf(radian * (j+1));
            triangleVertices[index+5].position.z = SPHERE_RADIUS * sinf(radian * (j+1)) * sinf(radian * (i+1));
            triangleVertices[index+5].color = XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f);
        }
    }
    

    테스트 프로그램이기 때문에 매크로를 사용하고 있습니다.
    수박 가죽과 같은 10개의 다각형을 연결한 것을 작성하고, 그것을 20개 작성하는 것으로 실현하고 있습니다.

    또 하나, 사례를 소개합니다.

    뷰어처럼 카메라 움직임



    이 식의 강점은, 어느 중심으로부터의 거리(r)와 2개의 각도(Θ와 φ)를 건네주는 것으로, 360도 어느 위치에서도 좌표를 산출할 수 있는 점입니다.
    상상하기 쉬운 것은 360도 어디에서나 캐릭터를 볼 수 있는 Viewer 기능입니다.
    플릭 조작의 세로 손가락의 이동량을 Θ로, 옆의 이동량을 φ에 동기시켜 주는 것으로, 플릭 조작으로 어느 각도에서도 캐릭터를 볼 수 있는 UI를 표현할 수 있습니다.
    확대나 축소는, r 를 조작하는 것으로 표현 가능합니다.
    주시점의 이동은, 계산된 좌표에, 벡터를 더하는 것으로 표현할 수 있습니다.

    3차원의 표현을 할 수 있기 때문에, 카메라의 이동 뿐만이 아니라, 캐릭터의 이동에도 사용할 수 있으므로, 꼭, 시험해 게임 수학을 즐겨 주세요.

    나에게서 이상이 될거야.

    좋은 웹페이지 즐겨찾기