矩阵类Directx& OpenGL的

时间:2009-11-30 23:18:01

标签: c++ opengl directx matrix

我有以下C ++矩阵类:

transform.h transform.cpp

我正在使用这个渲染器,其中有一个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);
        }

结果是图形的可见区域没有显示任何内容,无论我在这里放置光标。

所以:

  1. 我的转换类是否已正确实现?
  2. 如何使用directx?
  3. 编辑:

    设置了以下代码:

                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

    所以矩阵正在交换。这排除了交换轮码作为问题的原因。

3 个答案:

答案 0 :(得分:2)

OpenGL和DirectX具有相反的矩阵表示,但它们也具有相反的vector * matrix顺序:

  • OpenGL:M * v。 M是内存中的专栏
  • DirectX: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下根本不起作用......