矩阵类Directx&;OpenGL 我有下面的C++矩阵类:
我使用的是一个渲染器,它有一个opengl和一个directx实现 我有一个测试示例,其中使用窗口中鼠标的坐标将图形定位在光标下。这在OpenGL下可以正常工作 因为directx是行主视图,opengl是列主视图,所以我按如下方式反转矩阵,并在渲染之前将其传递给directx:矩阵类Directx&;OpenGL 我有下面的C++矩阵类:,c++,opengl,directx,matrix,C++,Opengl,Directx,Matrix,我使用的是一个渲染器,它有一个opengl和一个directx实现 我有一个测试示例,其中使用窗口中鼠标的坐标将图形定位在光标下。这在OpenGL下可以正常工作 因为directx是行主视图,opengl是列主视图,所以我按如下方式反转矩阵,并在渲染之前将其传递给directx: if(o->tree){ CObjectTransform* t = o->tree->GetTransform(o->transformID);
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);
}
if(o->tree){
CObjectTransform*t=o->tree->GetTransform(o->transformID);
d3d矩阵d;
浮动*m=(浮动*)&d;
用于(INTU=0;使用转换(D3DTS\u WORLD,&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];
}
}
float test[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
memcpy(test,&d,sizeof(d));
float*m=(float*)&d;
对于(int u=0;u<p>),假设您将此编译为C++。
这:
可能不做你想做的事情。在C++中,2D数组被索引为<代码> M[U] [V] < /代码>。
这一行实际做的是使用
,
运算符,该运算符对其语句求值,因此m[u,v]
实际上返回v
坐标的浮点值
您可能想做的是:
m[u + 4*v] = t->worldtransform.matrix[v + 4*u];
OpenGL和DirectX有相反的矩阵表示法,但它们也有相反的vector*matrix
顺序:
- OpenGL:
M*v
.M是内存中的主要列
- DirectX:
v*M
.M是内存中的主要行
由于乘法是反向的,所以必须将OpenGL矩阵转置以传递给DX。但由于DX使用row MARGER,因此必须再次转置。转置两次才是真正的标识
不进行任何转换如何?您知道,在上面显示的两个矩阵中,第一个矩阵是正确的DirectX矩阵。第二个矩阵在DX下根本不起作用…这确实修复了我代码中的一个错误,但它没有满足我的要求=(我将编辑上面的代码以反映这一点,如果将鼠标移动到窗口顶部,我将得到一个黑色三角形,即纹理三角形(以正方形排列),三角形靠着窗口的一侧,光标是最终点,对角线向下为零,但是三角形点不跟随光标,并且根据鼠标位置的不同,其行为不稳定。您可以做的最好的事情是调试它,并确保转置后得到的矩阵是正确的实际上是转置矩阵。使用“观察”窗口查看它并进行验证。如果我在代码中将我的转换从“转换”更改为“缩放”,那么我将获得预期的缩放行为,从而完全避开了这个问题,并实现了一个带有directx和opengl实现的接口,该接口封装了每个API本机API,因此,一切都按预期工作^ ^我尝试过,但根本没有得到预期的结果,我有点放弃了,并为directx编写了一个包含directx矩阵API的实现接口
m[u + 4*v] = t->worldtransform.matrix[v + 4*u];