У меня есть следующий класс матрицы 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);
}
В результате этого ничего не отображается в видимой области на графике, независимо от того, где я поставил курсор.
Итак:
- Правильно ли реализован мой класс преобразования?
- Как мне заставить его работать с 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
Итак, матрица обменивается. Это исключает замену кода округления в качестве причины проблемы.