我有以下 C++ 矩阵类:
我将其与渲染器结合使用,渲染器有一个 opengl 和一个 directx 实现。
我有一个测试示例,其中窗口内鼠标的坐标用于将图形定位在光标下。这在 OpenGL 下按预期工作。
因为directx是行主,opengl是列主,所以我按如下方式反转矩阵并在渲染之前将其传递给directx:
if(o->tree){
CObjectTransform* t = o->tree->GetTransform(o->transformID);
D3DMATRIX d;
float* m = (float*)&d;
for (int u=0; u<4; u++){
for (int v=0; v<4; v++){
m[u +v*4] = t->worldtransform.matrix[v+u*4];
}
}
pd3dDevice->SetTransform(D3DTS_WORLD, &d);
}
这样做的结果是,无论我将光标放在这里,图形的可见区域中都没有显示任何内容。
所以:
- 我的转换类是否正确实现?
- 如何让它与 directx 一起使用?
编辑:
设置了以下代码:
float* m = (float*)&d;
for (int u=0; u<4; u++){
for (int v=0; v<4; v++){
m[u +v*4] = t->worldtransform.matrix[v+u*4];
}
}
float test[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
memcpy(test,&d,sizeof(d));
矩阵类的值:
1,0,0,0
0,1,0,0
0,0,1,0
47,-30,0,1
交换矩阵的值:
1,0,0,47
0,1,0,-30
0,0,1,0
0,0,0,1
所以矩阵正在被交换。这排除了交换轮代码作为问题原因的可能性。
最佳答案
OpenGL 和 DirectX 具有相反的矩阵表示形式,但它们也具有相反的 vector * 矩阵
顺序:
- OpenGL:
M * v
。 M 是内存中的主列 - DirectX:
v * M
。 M 是内存中的行主
由于乘法是相反的,因此您必须转置 OpenGL 矩阵才能传递给 DX。但由于DX使用行专业,所以必须再次转置。转置两次真是恒等式。
您尝试完全不进行任何转换怎么样?
关于c++ - 矩阵类 Directx 和 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1823081/