你最好打赌是读Matrices, Handedness, Pre and Post Multiplication, Row vs Column Major, and Notations。
的XNA Game Studio的数学库(因此Monogame,团结等)使用右手坐标系,行为主的矩阵,行向量和预乘法。
DirectXMath库使用行主矩阵,行向量和前乘法,但留给你选择使用左手或右手坐标系统。现在更老的是deprecated D3DXMath。
在任一系统中,你还在做同样的物体坐标 - >世界坐标 - >眼睛坐标 - >剪辑坐标转换。
所以用OpenGL GLM你可以这样做:
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);
,你会得到相同的变换结果。
如果你是新的DirectXMath,那么你应该看看在DirectX Tool Kit的SimpleMath包装里面隐藏一些与C++构造函数和运营商严格的SIMD友好对齐要求。由于SimpleMath基于XNA Game Studio C#数学设计,因此它假定右手视图坐标,但如果需要,您可以轻松地将其与“原生”DirectXMath混合使用以使用左手视图坐标。
大多数这些决定是任意的,但确实有合理的设计推理。 OpenGL的数学库试图匹配正常的后乘法数学约定,这导致他们采用列主矩阵。在Direct3D的早期阶段,团队认为连接顺序的颠倒是令人困惑的,所以他们翻转了所有的约定。多年以后,XNA Game Studio团队认为传统的Direct3D串联顺序很直观,但是“向前”是负向z令人困惑,所以他们转向右手坐标。因此,许多更现代的Direct3D样本都使用右手视图系统,但您仍然可以看到Direct3D样本的左手和右手视图设置组合。因此,在这一点上,我们确实拥有“OpenGL风格”,“经典Direct3D风格“和”现代Direct3D风格“。
请注意,当使用固定功能硬件完成某些事情时,这些约定真的很重要,但对可编程着色器流水线而言,重要的是您是一致的。实际上,HLSL着色器默认预期矩阵为列主要形式,所以您经常会看到DirectXMath矩阵在复制到常量缓冲区时进行转置。
没有'旋转()'或'翻译()'在OpenGL或DirectX的方法。那你指的是什么?旧的OpenGL矩阵堆栈函数'glRotatef()'等不计数。 –
这就是为什么我提到伪代码的原因,因为我想比较2个库,而没有语法方式。 –
但是,如果两个库都不支持这种语法,那么使用这种伪代码就毫无意义。更具体地说,OpenGL没有任何集成数学,并且DirectX的数学库已经被自己提取到一个库中。 –