Rotatio

개념

object를 회전시키는 방법에 대해서 알아본다. 회전 이전 좌표를 (x, y) 이후 좌표를 (x’, y’)이라고 할 때, 각각의 좌표를 구하는 방법을 아래와 같이 나타낼 수 있다.

해당 식에서 x’, y’에 대해서 삼각함수 덧셈 정리 를 이용하여 전개하면 아래 와 같이 나타낼 수 있다.

여기서 r을 분배하고, x,y를 치환시켜 줌으로써 다시 아래와 같이 정리할 수 있다.

마지막으로, 해당 식을 더욱 간단히 하기 위해서 matrix로 다음과 같이 나타낼 수 있다.

코드

vec3 RotateAboutZ(const vec3 &v, const float &theta) {
    glm::vec2 target(v.x, v.y);
    glm::mat2 rotationMatrix = glm::mat2(cos(theta), -sin(theta), sin(theta), cos(theta));
 
    return vec3(target * rotationMatrix, v.z);
}

Translation

vec3 translation = vec3(0.0f);
 
for (size_t i = 0; i < circle.vertices.size(); i++) {
        this->circle.vertices[i] += this->translation;
    }

코드와 같이 모든 vertices를 돌면서 이동할 수치 만큼 더해주면 된다.

Scale

for (size_t i = 0; i < circle.vertices.size(); i++) {
    this->circle.vertices[i].x *= this->scaleX;
    this->circle.vertices[i].y *= this->scaleY;
}

코드와 같이 모든 vertices를 돌면서 scale된 수치 만큼 곱해주면 된다.