2012-06-07 1 views
2

직접 모드 OpenGL 프로그램에서 VRML으로 장면을 내보내려고합니다.OpenGL 4 행렬을 VRML로 변환 T * R * S

OpenGL과 VRML에서 얼굴은 장면 원점을 기준으로 한 자체 번역, 회전 및 크기 조정을 통해 객체로 그룹화 할 수 있습니다.

OpenGL에서 이들은 하나의 행렬 [1]에 번역 및 회전/스케일을 나타내는 4- 매트릭스로 저장됩니다. VRML에서 이들은 별도의 번역, 회전 및 스케일링 벡터로 표현되어야합니다 [2][3].

이 방식으로 임의의 4- 매트릭스를 어떻게 분해 할 수 있습니까?

라이브러리 기능을 사용하여 유지 관리해야하는 코드를 최소화하고 오류 발생 가능성을 줄이는 것이 좋습니다. Windows에서 C#을 사용하고 있으며 CLR 또는 Windows 네이티브 DLL에 액세스 할 수 있습니다.

답변

1

Monogame 소스에서 Matrix.Decompose code을 살펴보십시오.

Remember - OpenGL 매트릭스는 열 메이저이며 DirectX/XNA는 행 메이저입니다.

희망이 있습니다.

+1

감사합니다. 이상적입니다. 나는 이것을 시험해보고 작동한다면 답을 받아 들일 것이다. – Rich

+0

그게 필요한 물건을 많이 가지고 있지만, 몇 곳에서 부족합니다. 첫째, Quaternions를 사용하는 반면, VRML은 축각을 필요로하며,이 라이브러리에는 Quaternion -> AxisAngle 함수가 없습니다. 저는 지금 하나 추가하려고 합니다만, 방금 들여 보낼 수있는 라이브러리가 필요합니다. 둘째, VRML이 M -> T * R * S를 원하지만 M -> S * R * T (나는 생각합니다)를 분해합니다. . 번역 노드를 여러 개 사용하여이 작업을 수행 할 수 있습니다. – Rich

1

이 방식으로 임의의 4- 매트릭스를 어떻게 분해 할 수 있습니까?

변환의 가장 오른쪽 열은 번역 벡터 T입니다.

크기와 회전은 추출하기가 조금 더 복잡합니다. 회전 축과 회전 각도를 찾아야합니다. 근본적으로 여기에서 고유 벡터 문제를 다루고 있습니다 : 행렬의 변형에 따라 변하지 않는 벡터를 찾으십시오. 이것은 고유 벡터에 대한 경우입니다. 회전은 직교 변환입니다. 따라서 회전 행렬의 비정상적인 부분은 크기 조정입니다. 이 축척을 먼저 정규화하여 행렬로 추출하여 축척 계수 S을 생성합니다. 마지막으로 고유 벡터 문제를 해결하여 회전 축인 두 개의 반 평행 고유 벡터를 찾을 수 있습니다. 해당 고유치는 회전의 cos (α)을 지정하며 회전 축과 각도는 R입니다.

+0

내 행렬의 일부가 회전과 스케일링을 결합하기 때문에 고유 벡터 분해가 충분하지 않습니다.선형 수학에 관한 막연한 문단이 아니라 라이브러리 기능을 요청했습니다. – Rich

+0

@Rich : 네, 회전 매트릭스를 normlaize하여 스케일링 팩터를 효과적으로 내뿜어 스케일링을 추출 했으므로 충분합니다. 도서관에 관해서. 적 선형 수학 라이브러리는 이러한 트릭을 할 것입니다. 예를 들어 Eigen (Google it)과 같습니다. 작은 것을 원하면 4x4 회전 행렬을 쿼터니언으로 변환하는 함수를 제공하는 https://github.com/datenwolf/linmath.h를 사용할 수 있습니다. 정규화 된 quarternion은 회전 축과 각도를 효과적으로 반영합니다. – datenwolf

0

SFMatrix4f/d 및 SFMatrix3/d는 구성 요소의 행렬을 분해하는 함수를 내장하고 있습니다. 다음은 사양의 페이지입니다 : http://www.web3d.org/documents/specifications/19777-1/V3.0/Part1/functions.html#t-Matrix4Functions.

자바 스크립트에서는 입력 할 수 있습니다

function foo (matrix4f) 
{ 
    var translation = new SFVec3f(); 
    var rotation = new SFRotation(); 
    var scale  = new SFVec3f(); 

    matrix4f .getTransform (translation, rotation, scale); 
} 

일부 브라우저는 scaleOrientation 및 센터 인수를 getTransform를 위해 네 번째와 다섯 번째 매개 변수로 지원합니다.