我有以下C ++矩阵类:
我正在使用这个渲染器,其中有一个opengl和一个directx实现。
我有一个测试示例,其中窗口内鼠标的坐标用于定位光标下的图形。这在OpenGL下可以正常工作。
因为directx是行major,而opengl是列major,我按如下方式反转矩阵并在渲染之前将其传递给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);
}
结果是图形的可见区域没有显示任何内容,无论我在这里放置光标。
所以:
编辑:
设置了以下代码:
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
所以矩阵正在交换。这排除了交换轮码作为问题的原因。
答案 0 :(得分:2)
OpenGL和DirectX具有相反的矩阵表示,但它们也具有相反的vector * matrix
顺序:
M * v
。 M是内存中的专栏v * M
。 M是内存中的主要行由于乘法相反,您必须转置OpenGL矩阵以传递给DX。但由于DX使用行专业,你必须再次转置。两次转置真的是身份。
你怎么试着没有转变呢?
答案 1 :(得分:1)
我假设您正在将其编译为C ++ 这样:
m[u,v] = t->worldtransform.matrix[v,u];
可能不会做你想做的事。在C ++中,2D数组被索引为m[u][v]
这一行实际上做的是使用,
运算符来计算其语句,因此m[u,v]
实际返回float
坐标的v
。
您可能想要做的是:
m[u + 4*v] = t->worldtransform.matrix[v + 4*u];
答案 2 :(得分:0)
您了解到,在上面显示的2个矩阵中,第一个是正确的DirectX矩阵。第二个在DX下根本不起作用......