회전
역 코사인, 사인 함수로 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)가 하는 일들입니다.
}