새소식

인기 검색어

게임 개발/그래픽스

2차원 변환

  • -

회전

역 코사인, 사인 함수로 phi(피)의 각도를 구하는 것도 가능하지만,

코사인-사인 법칙을 이용해서 다음과 같이 더 간단히 할 수 있다. (phi피가 사라짐)

 

vec3 RotateAboutZ(const vec3 &v, const float &theta)
{
    vec3 vp{v.x * cos(theta) - v.y * sin(theta),
            v.x * sin(theta) + v.y * cos(theta), 0.0f};
    return vp;
}

Update() 함수 이동, 회전, 스케일

void Rasterization::Update() {
    // 애니메이션 구현

    // GUI 입력에 대해서 vertexBuffer 업데이트
    // 이 예제에서는 this->vertexBuffer만 업데이트하고
    // colorBuffer와 indexBuffer는 변화 없음

    //// 이동(Translation)
    //for (size_t i = 0; i < circle.vertices.size(); i++)
    //{
    //    this->vertexBuffer[i] = this->translation1 + circle.vertices[i];
    //}

    //// 회전(Rotation)
    //for (size_t i = 0; i < circle.vertices.size(); i++)
    //{
    //    this->vertexBuffer[i] =
    //        RotateAboutZ(circle.vertices[i], this->rotation1);
    //}

    ////스케일(scale)
    //for (size_t i = 0; i < circle.vertices.size(); i++)
    //{
    //    this->vertexBuffer[i] = circle.vertices[i] * vec3{scaleX, scaleY, 1.0f};
    //}

    for (size_t i = 0; i < circle.vertices.size(); i++)
    {
        // 연산 순서:
        // 첫번째 회전한 상태에서 scaling 그 다음에 첫번째 translation
        // 두번쨰 rotation, 두번째 transaltion
        for (size_t i = 0; i < circle.vertices.size(); i++)
        {
            this->vertexBuffer[i] =
                RotateAboutZ(
                RotateAboutZ(circle.vertices[i], this->rotation1) // 첫번째 회전
                * vec3{scaleX, scaleY, 1.0f} // 첫번째 scaling
                + this->translation1             // 첫번째 translation
                , this->rotation2) // 두 번째 rotation
                + this->translation2;
        }


    }

    // 중요: 버텍스 쉐이더(Vertex shader)가 하는 일들입니다.
}

 

'게임 개발 > 그래픽스' 카테고리의 다른 글

깊이 버퍼 (Depth buffer / z-buffer)  (0) 2023.11.07
2차원 애니메이션  (0) 2023.11.07
원 그리기  (0) 2023.11.07
삼각형 레스터화  (0) 2023.11.05
레스터화(rasterization)가 빠른 이유  (0) 2023.11.04
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.