2014-12-26 3 views
2

현재 Android 개발 용 OpenGL ES를 배우고 있습니다. 이제는 ModelMatrixCameraMatrix을 다루어야 만하지만 몇 가지 질문이 있습니다. OpenGL에서 우리는 항상 4x4 행렬을 사용하며 왜 이렇게했는지는 이해하지만 다른 값이 어디에 있는지는 알지 못합니다. 이 행렬에 저장됩니다. 예를 들어 회전과 위치. 나는 현재 rotation, position이 매트릭스에서 개체/카메라의 scale을 찾을 수있는OpenGL에서 매트릭스 위치, 회전 및 크기 조정

 0 1 2 3 
    ----------------- 
0 | | | | | 
    ----------------- 
1 | | | | | 
    ----------------- 
2 | | | | | 
    ----------------- 
3 | | | | | 
    ----------------- 

당신이 말해 주시겠습니까 :의 우리가이 4 × 4 매트릭스 있다고 가정 해 봅시다? 그리고 같은 위치에있는 모든 매트릭스에 대해서입니까?

답변

5

간단하게하기 위해 행렬에는 회전, 평행 이동 및 균일 조정이 포함되어 있다고 가정합니다. 일반 변환 행렬은 다음과 같이 다른 유형의 변환을 나타낼 수 있습니다.

  • 비 균일 스케일링.
  • 전단 변형.

회전 및 비율은 행간의 왼쪽 상단 3x3 부분에 있으며 각 방향의 인덱스는 0-3입니다. 스케일링이없는 경우이 3x3 행렬의 각 행 벡터는 길이가 1.0입니다. 이 스케일링하는 경우,이 행 벡터의 임의의 길이를 계산하여 스케일링 팩터를 계산할 수

scalingFactor = sqrt(m00 * m00 + m01 * m01 + m02 * m02); 

회전 행렬이 다음 스케일링 계수에 의해 3 × 3 서브 행렬의 모든 요소를 ​​분할함으로써 얻어진다

          [ m00 m01 m02 ] 
rotationMatrix = (1.0/scalingFactor) * [ m10 m11 m12 ] 
             [ m20 m21 m22 ] 

번역 벡터 마지막 ​​열의 처음 3 개 요소에 있습니다 OpenGL을 저장 행렬을 기대하는이 모든으로

    [ m03 ] 
translationVector = [ m13 ] 
        [ m23 ] 

, 염두에 두어야 컬럼 주요 순서로. 따라서 메모리에있는 행렬의 배열은 다음과 같습니다.

m00 m10 m20 m30 m01 m11 ... 
1

척도와 회전은 왼쪽 위의 3 × 3 부분 행렬을 공유합니다. 다음과 같이 T이라고 부르 자.

회전을 스케일링에서 분리하려면 왼쪽 위 3 × 3 매트릭스를 직교 정규화하십시오. 회전 부분, R입니다. 그런 다음 '당신이 경우에 따라 방정식

T = R의 시스템 · S

또는

T = S · R

를 해결 프리 또는 포스트 회전 스케일링을 찾고 S.

일반적인 크기 조정 행렬은 대각선 행렬이므로 대각선을 제외하고 두 경우 모두를 해결하고 그 중 어느 것이 0인지를 확인할 수 있습니다.


번역은 4 번째 열입니다.


제 4 행은 동질이 행 좌표 및 원근 투영 매트릭스를 처리하지 않는 한 (즉, 투시 투영을 포함 행렬) 항상 [0 0 1] 읽어야한다. 나는 현재 회전, 위치 및 OpenGL의 작동 방식이 아닌 객체

의 규모를 찾을 수있는 곳



당신이 말해 주시겠습니까. OpenGL에는 객체와 카메라가 없습니다. 화면에 하나씩 그려지는 점, 선 및 삼각형이 있습니다. 변환 행렬은 로컬 공간 좌표에서 화면 공간으로 변환 행렬을 배치하는 데 사용됩니다.