가장 좋은 방법은 Matrices, Handedness, Pre and Post Multiplication, Row vs Column Major, and Notations입니다.
OpenGL 코드는 종종 오른 손잡이 좌표계, 열 - 주요 행렬, 열 벡터 및 사후 곱셈을 사용합니다.
Direct3D 코드는 종종 왼손잡이 좌표계, 행 주요 행렬, 행 벡터 및 사전 곱셈을 사용합니다.
는 XNA 게임 스튜디오의 수학 라이브러리 (따라서 Monogame, 유니티 등) 시스템, 행 주요 행렬, 행 벡터, 사전 곱셈을 조정 오른 손잡이 사용합니다.
DirectXMath 라이브러리는 행 주요 행렬, 행 벡터 및 사전 곱셈을 사용하지만 중요한 경우 왼손잡이 또는 오른 손잡이 좌표 시스템을 사용하도록 선택할 때까지 남겨 둡니다. 이것은 더 오래된 것의 지금조차이었다 deprecated D3DXMath.
두 시스템에서 여전히 동일한 개체 좌표 -> 세계 좌표 -> 눈 좌표 -> 클립 좌표 변환을 수행하고 있습니다.
using namespace glm;
mat4 myTranslationMatrix = translate(10.0f, 0.0f, 0.0f);
mat4 myRotationMatrix = rotate(90.f, vec3(0, 1, 0));
mat4 myScaleMatrix = scale(2.0f, 2.0f, 2.0f);
mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix;
vec4 myTransformedVector = myModelMatrix * myOriginalVector;
는 DirectXMath에서 당신이 할 것 :
using namespace DirectX;
XMMATRIX myTranslationMatrix = XMMatrixTranslation(10.0f, 0.0f, 0.0f);
XMMATRIX myRotationMatrix = XMMatrixRotationY(XMConvertToRadians(90.f));
XMMATRIX myScaleMatrix = XMMatrixScaling(2.0f, 2.0f, 2.0f)
XMMATRIX myModelMatrix = myScaleMatrix * myRotationMatrix * myTranslationMatrix;
XMVECTOR myTransformedVector = XMVector4Transform(myOriginalVector, myModelMatrix);
을 그리고 당신은 그 결과와 같은 변환을 얻을 것이다
그래서 OpenGL을 GLM과 당신이 할 수 있습니다.
당신이 DirectXMath를 처음 사용하는 경우, 다음의 C++ 생성자와 연산자와 엄격한 SIMD 친화적 정렬 요구 사항의 일부를 숨 깁니다 DirectX Tool Kit에서 SimpleMath 래퍼 살펴 보셔야합니다. SimpleMath는 XNA Game Studio C# 수학 디자인을 기반으로하기 때문에 오른쪽보기 좌표를 사용한다고 가정하지만 원할 경우 왼손보기 좌표를 사용하기 위해 '기본'DirectXMath와 쉽게 혼합 할 수 있습니다.
이러한 결정의 대부분은 임의적 이었지만 올바른 설계 추론을 가지고있었습니다. OpenGL의 수학 라이브러리는 포스트 멀티 플리 팅의 일반적인 수학적 규칙에 부합하려고 시도했는데, 이로 인해 컬럼 - 주요 매트릭스가 채택되었습니다. Direct3D 초기에 팀은 연결 순서를 뒤집어 놓는 것이 혼란스럽고 모든 규칙을 뒤집을 수 있다고 느꼈습니다.
몇 년 후 XNA Game Studio 팀은 기존의 Direct3D 연결 순서가 직관적이라고 느꼈지만 '앞으로'가 음수 인 것은 혼란 스럽기 때문에 오른 손잡이 좌표로 전환했습니다. 따라서보다 현대적인 Direct3D 샘플의 대부분은 오른 손잡이 뷰 시스템을 사용하지만 Direct3D 샘플의 왼쪽 및 오른쪽보기 설정을 모두 볼 수 있습니다.이 시점에서 우리는 실제로 "OpenGL 스타일", " 고전적인 Direct3D 스타일 "및"현대 Direct3D 스타일 "을 지원합니다.
고정 관념의 하드웨어를 사용하지만 프로그램 가능한 쉐이더 파이프 라인을 사용하여 작업을 수행 할 때 실제로 이러한 관습이 중요하다는 것은 사용자가 일관성을 유지한다는 것입니다. 실제로, HLSL 셰이더는 행렬이 열 - 주요 형식이 될 것으로 기대하므로 기본적으로 DirectXMath 행렬은 상수 버퍼에 복사 될 때 바뀝니다.
OpenGL 또는 DirectX에는'rotate()'또는'translate()'메소드가 없습니다. 그래서 당신은 무엇을 언급하고 있습니까? 그리고 오래된 OpenGL 행렬 스택 함수 인'glRotatef()'등은 포함되지 않습니다. –
이것이 문법을 사용하지 않고 2 개의 라이브러리를 비교하기 때문에 의사 코드를 언급 한 것입니다. –
그러나 두 라이브러리 중 어느 것도이 종류의 구문을 지원하지 않으면 이러한 종류의 의사 코드를 사용할 필요가 없습니다. 보다 구체적으로, OpenGL은 통합 수학을 전혀 가지고 있지 않으며 DirectX의 수학 라이브러리는 라이브러리 자체로 추출되었습니다. –