Матричные классы Directx и OpenGL - PullRequest
2 голосов
/ 01 декабря 2009

У меня есть следующий класс матрицы 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

Итак, матрица обменивается. Это исключает замену кода округления в качестве причины проблемы.

Ответы [ 3 ]

2 голосов
/ 01 декабря 2009

OpenGL и DirectX имеют противоположные матричные представления, но они также имеют противоположный vector * matrix порядок:

  • OpenGL: M * v. М - главный столбец в памяти
  • DirectX: v * M. М - главный ряд в памяти

так как умножение обратное, вы должны транспонировать матрицу OpenGL для передачи в DX. Но так как DX использует мажор строк, вам придется снова транспонировать. Транспонировать дважды - это действительно идентичность.

Как насчет того, чтобы попытаться вообще без преобразования?

1 голос
/ 01 декабря 2009

Я предполагаю, что вы компилируете это как C ++.
Это:

m[u,v] = t->worldtransform.matrix[v,u];

Вероятно, не делает то, что вы хотите. в C ++ двумерный массив индексируется как m[u][v].
На самом деле эта строка использует оператор ,, который оценивает ее оператор, поэтому m[u,v] фактически возвращает float из v координат.

что вы, вероятно, хотите сделать, это:

m[u + 4*v] = t->worldtransform.matrix[v + 4*u];
0 голосов
/ 01 декабря 2009

Вы понимаете, что из двух матриц, показанных выше, первая - правильная матрица DirectX. Второй вообще не будет работать под DX ...

...