c++ - 矩阵类 Directx 和 OpenGL

标签 c++ opengl directx matrix

我有以下 C++ 矩阵类:

transform.h transform.cpp

我将其与渲染器结合使用,渲染器有一个 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);
        }

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

所以:

  1. 我的转换类是否正确实现?
  2. 如何让它与 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/

相关文章:

c++ - 如何从文本文件中读取矩阵并将其存储到二维数组中?

python - OpenCV 在 Python 和 C++ 实现中对 HOG 对象检测的不同结果

c++ - 连接 std::vector 容器的可变参数模板函数

java - 生成球体顶点、索引和法线?

qt - Qt中的OpengL glDrawBuffers()?

c++ - 设置每个像素的最快方法

c++ - 代码按下的按钮

c++ - ksmedia.h 中的编译错误(在直接 X sdk 中)

c++ - reinterpret_cast 编译失败

c++ - OpenGL GLFW : undefined reference to 'glfwInit'