Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
矩阵类Directx&;OpenGL 我有下面的C++矩阵类:_C++_Opengl_Directx_Matrix - Fatal编程技术网

矩阵类Directx&;OpenGL 我有下面的C++矩阵类:

矩阵类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);

我使用的是一个渲染器,它有一个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);
        }
if(o->tree){
CObjectTransform*t=o->tree->GetTransform(o->transformID);
d3d矩阵d;
浮动*m=(浮动*)&d;
用于(INTU=0;使用转换(D3DTS\u 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));
    
    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];