2012-09-28 3 views
1

저는 열 메이저 매트릭스 순서를 사용하는 OpenGL 그래픽과 함께 사용할 수학 수업을 작성하고 있습니다. 이것은 숙제입니다.OpenGL에 대한 주요 주 주문

다른 행렬 클래스와 함께 mat3 (내 행렬 3x3 클래스)에 대해 행렬 표기법을 사용하여 행렬 데이터를 설명했습니다. 이제 주문 순서가 잘못되었다고 생각합니다 (예 : 열 전공보다는 행 주요 전공).

#define real float 
union 
{ 
    real _data[9]; 
    struct 
    { 
     real _11; real _12; real _13; 
     real _21; real _22; real _23; 
     real _31; real _32; real _33; 
    }; 
    struct 
    { 
     real _a; real _b; real _c; 
     real _d; real _e; real _f; 
     real _g; real _h; real _i; 
    }; 

}; 

내가 대신 2 구조체는 다음과 같이 서면해야합니다

struct 
{ 
    real _11; real _21; real _31; 
    real _12; real _22; real _32; 
    real _13; real _23; real _33; 
}; 

이 순서에 영향을 미칩니 까 다음과 같이

struct 
{ 
    real _a; real _d; real _g; 
    real _b; real _e; real _h; 
    real _c; real _f; real _i; 
}; 

, 나는 처음 구조체를 작성해야한다 행렬 곱셈 또는 다른 수학 연산 (행렬식, 역행렬, 조옮김 ...)? 예 : 현재 내 mat3 함수는 다음과 같습니다.

mat3 operator * (const mat3 & l, const mat3 & r) 
{ 
    // matrix matrix multiply 
    return mat3(
     ((l._11 * r._11) + (l._12 * r._21) + (l._13 * r._31)), 
     ((l._11 * r._12) + (l._12 * r._22) + (l._13 * r._32)), 
     ((l._11 * r._13) + (l._12 * r._23) + (l._13 * r._33)), 

     ((l._21 * r._11) + (l._22 * r._21) + (l._23 * r._31)), 
     ((l._21 * r._12) + (l._22 * r._22) + (l._23 * r._32)), 
     ((l._21 * r._13) + (l._22 * r._23) + (l._23 * r._33)), 

     ((l._31 * r._11) + (l._32 * r._21) + (l._33 * r._31)), 
     ((l._31 * r._12) + (l._32 * r._22) + (l._33 * r._32)), 
     ((l._31 * r._13) + (l._32 * r._23) + (l._33 * r._33)) 
    ); 
} 

이 문제는 많은 사람들을 혼란스럽게합니다. 나는 주제에 관한 교과서를 읽은 후 IDE에 앉아서 수업을 작성해야만 혼란이 생길 ​​것이라고 생각합니다. 두 과목은 거의 함께 다루지 않습니다.

답변

2

수학적으로 말하면, 행렬 곱셈은 행/행 주 순서에 관계없이 같은 방식으로 작동합니다. 열/행 주요 순서가 영향을 미치는 것은 행렬을 만드는 방법입니다. 예를 들어 회전 행렬을 작성하는 방법. 또한

: 배열 값에 대한

전체 열/행 중요한 것은 단지 문제를 다음과 같이

는 내가 처음 구조체를 작성해야합니다. 열/행 주요 질문은 행렬을 배열로 저장하는 방법에 관한 것입니다. 9 개의 값 배열이 있고 3x3 행렬이 행 주요 형식으로 저장된 경우 두 번째 열, 첫 번째 행의 인덱스는 0부터 시작하는 인덱스 1이됩니다. 열 - 주요 저장에서 두 번째 열, 첫 번째 행 인덱스

그래서 노조를보십시오. 공용체의 요점은 다른 방법으로 동일한 부동 소수점에 액세스하는 것입니다. _21 회원은 첫 번째 행의 두 번째 열이라고 가정합니다. 그렇다면 배열의 오른쪽 부분에 매핑되는지 확인하는 것은 사용자의 책임입니다. 배열이 column-major 인 것으로 가정되면 _21_data[3]과 동일한 값으로 매핑되어야합니다. 행의 전공 인 경우 _data[1]으로 매핑되어야합니다.