3차원 4x4 변환 행렬에서
Rotation과 Translation 정보를 접근할 수 있습니다. 참고로 대각행렬은 Scale 수치를 알 수 있습니다.
( r00 r01 r02 t03 )
( r10 r11 r12 t13 )
( r20 r21 r22 t23 )
( 0 0 0 1 )
이 형태는 행기준의 행렬이고 열기준이 되면 index를 transpose 해줘야 합니다. 이것을 우리말로 전치 행렬이라고 부릅니다. 전치를 하게 되면 아래와 같이 변하게 됩니다.
( r00 r10 r20 0 )
( r01 r11 r21 0 )
( r02 r12 r22 0 )
( t03 t13 t23 1 )
이 행렬은 열기준 행렬이고 만약 Translation 정보를 접근하려면 4행의 값들을 접근해야 합니다.
이 내용을 Eigen Library와 GLM(OpenGL Mathematics)을 통해서 Translation 관련된 내용으로 간략히 비교해 보도록 하겠습니다.
Eigen Library는 행기준 행렬을 사용하며 점(1,1,1)을 (11,12,13)으로 이동하는 코드는 아래와 같이 작성합니다.
Eigen::Vector3d p_eigen(1.0, 1.0, 1.0);
Eigen::Matrix4d mat_eigen = Eigen::Matrix4d::Identity();
mat_eigen(0, 3) = 11; // x 축으로 이동
mat_eigen(1, 3) = 12; // y 축으로 이동
mat_eigen(2, 3) = 13; // z 축으로 이동
// 결과 확인
std::cout << mat_eigen * Eigen::Vector4d(p_eigen.x(), p_eigen.y(), p_eigen.z(), 1.0) << "\n";
행 기준이기 때문에 변환 행렬에 이동 정보는 4열에 저장됩니다.
반면에 GLM은 열기준 행렬을 사용합니다. GLM을 이용해서 점(1,1,1)을 (11,12,13)으로 이동하는 코드는 아래와 같습니다.
glm::dvec4 p_glm(1, 1, 1, 1);
glm::dmat4 mat_glm = glm::translate(glm::dmat4(1), glm::dvec3(11, 12, 13));
cout << mat_glm[3][0] << endl; // index 확인
cout << mat_glm[3][1] << endl;
cout << mat_glm[3][2] << endl;
//결과 확인
glm::dvec4 top_trans = mat_glm*p_glm;
cout << top_trans.x << "," << top_trans.y << "," << top_trans.z << endl;
열 기준이기 때문에 변환 행렬에 이동 정보는 4행에 저장됩니다.
라이브러리 쓰는 입장에서 라이브러리에서 제공하는 메트릭스 정보를 행기준인지 열기준인지를 꼭 알 필요는 없지만 만약에 어플리케이션을 개발할 때 렌더링은 GLM 매트릭스로 사용하고 알고리즘에서 Eigen 매트릭스를 계산했을 때, 알고리즘에 사용된 매트릭스 정보를 렌더링 매트릭스에 적용하고 싶다면 행렬을 바꿔서 적용을 해야 결과가 제대로 나오게 됩니다.
glm::dmat4 mat;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
mat[j][i] = mat_eigen(i, j);
}
}
'3D Algorithm' 카테고리의 다른 글
3차원 삼각형 면적 계산 5가지 방법(좌표, 길이, 각도, 외적 이용) (1) | 2023.12.26 |
---|---|
AABB OBB 차이와 의미 (0) | 2023.12.11 |
세 점을 지나는 원 중심 계산(Eigen Library 이용한 최소자승법) (0) | 2023.11.28 |
CCW(Counter Clockwise) 정의와 판별 알고리즘 (0) | 2023.11.13 |
Backface Culling 의미와 기본 원리 (0) | 2023.11.08 |