2012-10-03 1 views
4

나는 Java에서 OpenGL 프로젝트를 작업하고 있으며, 자신의 코드에서 변환 행렬을 만들고 싶다는 점을 지적했다. 그래서 그것을 사용하여 세계를 수행 할 수있다. 스크린 포인트 변환, 그 반대의 경우도 마찬가지입니다. 변환을 지원하는 Matrix 클래스를 만들었습니다. 그 모든 것이 매우 잘 작동합니다. 그러나 실제로 역변환을 만드는 방법을 찾는 데 문제가 있습니다.반전 변환 행렬을 만드는 방법

  • 임의의 아핀 (4 × 4) 변환 행렬을 감안할 때, 당신은 어떻게 역변환 행렬을 만들려면 어떻게해야합니까 :

    그래서 제 질문은 이것이다? 일부 매트릭스는 변환 할 수 없습니까? 변환 행렬을 반전하는 데있어 제한과주의 사항은 무엇입니까?

제 연구에서 가장 간단한 방법은 행렬을 바꾸고 행렬을 부정하는 다양한 방법을 들었습니다. 그러나 실제로는 작동하지 않습니다. 이 방법은 일부 행렬에서는 작동하지 않으며 일부 행렬은 변환 할 수 없다고 들었습니다.

나는 실제로이 행렬을 뒤집을 때 무슨 일이 벌어지고 있는지 이해하고 싶기 때문에이 "방정식의 플러그"이상을 찾고 있습니다. 여기에는 "이 라이브러리 만 사용"답변도 제외됩니다. 앞으로 매트릭스 라이브러리로 이동할 수도 있지만, 지금은 직접 만들 계획입니다.

편집 : 누구나 묻기 전에 아니요 숙제입니다. 이것은 개인 프로젝트입니다.

편집 : 분명히 역을 계산하기위한 전략의 전체 목록은 여기에있다 행렬입니다 : 여기

+2

가 다시 아래로 규모로 그것을 깰하려고, 회전, 구성 요소를 번역? 수학적으로 완벽한 방법이 있다고는 생각하지 않지만, "이해할 수있는"구성 요소를 추출하는 기술이 있습니다. – nielsbot

+1

아니요, 이해 합니다만, 변환 행렬의 역함은 행렬이 "역전"된 것입니다. 작업. 따라서 "translate (1, 2, 3), rotate (45deg)"행렬이있는 경우 점에 적용하면 해당 연산이 적용되고 반대의 경우에는 해당 연산을 "실행 취소"또는 "반전"합니다. – jpfx1342

답변

2

http://en.wikipedia.org/wiki/Invertible_matrix 나는 물론 내 컴퓨터 그래픽에 사용되는 일부 코드, 기본적으로 내가의 역을 계산하는 가우스 요르단 제거를 사용 매트릭스. 행렬이 역전 될 수 있으려면 행렬식의 값이 0이 아니어야합니다. 나는이 코드를 코드에서 처리하지는 않았지만, 나는 이것을 모두 당신을 위해 처리하지 않을 것이다.

Matrix4* Matrix4::FindInverse(Matrix4 &a){ 

int n = R; 
int i = 0; 
int j = 0; 
float pivot = 0; 
Matrix4* invA = NULL; 
//TODO: Check whether the matrix is invertible.Else Return 
invA = new Matrix4(); 
invA->SetMatrix4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1); 


for(i = 0; i < n; i++){ 
    pivot = a.v[i][i]; 

    if(pivot != 1.0 and pivot != 0){ 
     for(int t = i; t < n; t++){ 
      a.v[i][t] = a.v[i][t]/pivot; 
      invA->v[i][t] = invA->v[i][t]/pivot; 
     } 
    } 

    //Update to the new pivot which must be 1.0 
    pivot = a.v[i][i]; 

    for(j = 0; j < n; j++){ 
     if(j==i){ 
      continue; 

     } 
     else{ 
      float l = a.v[j][i]/pivot; 
      for(int m = 0; m < n; m++){ 
       a.v[j][m] = a.v[j][m] - l * a.v[i][m]; 
       invA->v[j][m] = invA->v[j][m] - (l * invA->v[i][m]); 
      } 
     } 
    } 
} 
return invA; 

}

+0

괜찮습니다. 제가 말씀 드렸듯이, 저는 이것이 학습 경험이되기를 바랍니다. – jpfx1342

+0

매우 유용합니다. 나는 결코 이것을 발견하지 못했다고 나는 믿을 수 없다. 나는 몇 시간 동안 Wikipedia와 Google을 돌아 다니며 그것을 발견하지 못했다. 나는 또한 변환 행렬이 거의 단일 적이라는 언급을 들었으므로 이것은 잘 작동 할 것이다. 견고성에 대한 결정을 여전히 포함 할 것이지만, 고맙게 생각합니다. – jpfx1342

+0

좋은 답변 Apurv! –