본문 바로가기
3D Algorithm

행기준 열기준 행렬 개발자 주의점(Transform Matrix)

by DarkRock 2023. 12. 5.
반응형

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);
	}
}

 

반응형