Skip to content

튜토리얼 1. 함선 움직여 보기 (2)

GyeongMo Lim edited this page Jan 19, 2017 · 64 revisions

# 2. 특정 위치로 움직여 보기

자 그럼 빠르게 두번째 목표인 특정 위치로 함선을 움직여 보려합니다.

# 목차

  1. 극좌표란?
  2. 함선과 원점 (0, 0)사이의 거리 및 각도 구하기
  3. 원점으로 이동시켜보기
  4. 원점이 아닌 특정 위치로 이동시켜보기
  5. 원점이 아닌 특정 위치로 이동시켜보기 with 보정

# 1. 극좌표란?

특정 위치로 움직이기전에, 극좌표를 알고 넘어가야 합니다.

극좌표(polar coordinate)란
polar coordinate

기준점을 중심으로 한 점을 x,y가 아닌, 거리(r)와 각도(θ)로 표현하는 좌표계입니다. STARPOO에서는 각도로 degree 단위를 사용하고 있습니다. 위 그림과 같이, 원점을 중심으로 오른쪽 정방향이 0도이며 각도가 증가하면 반시계방향으로 회전하게 됩니다.

# 2. 함선과 원점 (0, 0)사이의 거리 및 각도 구하기

자 그럼 가장 쉽게 (0, 0)인 지점인 원점으로 함선을 이동시켜 보도록 하죠.

먼저 현재 함선의 위치를 가져와야겠죠?

STARPOO API 에서 제공하는 polarFrom({x, y, rot}, {x, y}) 함수를 사용하면 쉽게 함선과 target 사이의 거리와 각도를 구할 수 있습니다.

polarFrom({x, y, rot}, {x, y}) 함수의 반환값인 rot과 r은

  • r : 첫번째 인자와 두번째 인자간의 거리를 의미하며,
  • rot : 첫번째 인자가 바라보고 있는 방향을 기준으로 두번째 인자와의 각도를 의미합니다.

tutorial-3-move-specific point

지금 우리는 원점과 함선사이의 거리와 각도를 구할 것이기 때문에 첫번째 인자에 myShips[0]을, 두번째 인자에 {x: 0, y: 0}를 넣어주면 됩니다. 따라서 현재 함선의 위치에서 원점까지 거리와 각도를 구하기 위해 아래와 같이 코드를 작성한 뒤 log를 살펴 봅시다.

function update(){
    var pos = polarFrom(myShips[0], {x: 0, y: 0});

    // 로그 찍어보기
    log("rot : " + pos.rot);
    log("r : " + pos.r);
}

# 3. 원점으로 이동시켜보기

자, 이제 우리는 현재 함선과 원점 사이의 거리와 각도를 알았습니다. 이 정보를 토대로 함선을 원하는 위치인 원점으로 이동시키려합니다. 이를 위해서 함선이 수행해야하는 일은 두가지로 볼 수 있습니다.

  1. 함선의 뱃머리를 목표지점으로 돌리기
  2. 함선을 목표지점에 도착하지 않았다면 전진

위의 두가지 수행을 토대로 코드를 작성하여 봅시다.

var b_once = true;

function update() {
    var ship = myShips[0];
    var destination = {x: 0, y: 0};
    var pos = polarFrom(ship, destination);

    // 함선을 목표지점에 도착하지 않았다면
    if (pos.r > 0) {
        myShips[0].setRotSpeed(pos.rot);    // 1. 함선의 뱃머리를 목표지점으로 돌리기
        myShips[0].setSpeed(shipMaxSpeed);  // 2. 전진
    }
    
    // 목표 지점 도착
    else 
    {
        // 정지
        myShips[0].setRotSpeed(0);
        myShips[0].setSpeed(0);

        if (b_once) {
            b_once = false;
            log("x : " + ship.x);
            log("y : " + ship.y);
        }
    }
}

원점으로 가 멈추는 모습을 볼 수 있습니다.

# 4. 원점이 아닌 특정 위치로 이동시켜보기

그렇다면 위에서 작성한 script에 목적지만 (200, 700)으로 변경한 뒤 스크립트를 돌려 봅시다.

var b_once = true;

function update() {
    var ship = myShips[0];
    var destination = {x: 200, y: 700};
    var pos = polarFrom(ship, destination);

    ...
}

정확한 점에 멈추지 않고 빙글빙글도는 모습을 보게됩니다.. 왜 이런걸까요?

이러한 현상의 원인을 아래와 같이 3가지 정도로 추려볼 수 있습니다.

1. 거리 오차 범위를 주지 않아서 2. 목표 지점에 거의 도착할때 감속하지 않아서 3. 마찬가지로 목표 각도에 거의 도착할때 각도 회전을 감속하지 않아서

# 5. 원점이 아닌 특정 위치로 이동시켜보기 with 보정

var bonce = true;

function update() {
    var ship = myShips[0];
    var dest = {x: 200, y: 700};
    var pos = polarFrom(ship, dest);

    if (pos.r > 1) {
        myShips[0].setRotSpeed(pos.rot / dt);
        myShips[0].setSpeed(pos.r / dt);
    }
    else 
    {
        myShips[0].setRotSpeed(0);
        myShips[0].setSpeed(0);

        if (bonce) {
            bonce = false;
            log("x : " + ship.x);
            log("y : " + ship.y);
        }
    }
}