2009-11-30 127 views
2

我有以下C++類基質:矩陣類的DirectX和OpenGL的

transform.cpptransform.h

我用這再加上渲染器,用於其中有一個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

所以矩陣正在交換。這就排除了作爲問題原因的交換循環代碼。

+0

看來如果我在代碼中將轉換從一個轉換轉換爲一個縮放,那麼我會得到預期的縮放行爲 – 2009-12-01 00:44:40

+0

我完全避開了這個問題並實現了一個接口與包含每個API本機API的directx和opengl實現,因此,一切都按預期工作^ _^ – 2009-12-01 12:24:10

回答

1

我假設你將它編譯爲C++。
此:

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

可能不會做你想要它做的事情。在C++中,2D數組索引爲m[u][v]
這條線實際上做的是使用,運算符來計算它的語句,所以m[u,v]實際上返回v座標的float

你可能想要做的是這樣的:

m[u + 4*v] = t->worldtransform.matrix[v + 4*u]; 
+0

這確實修復了我的代碼中的錯誤,但它不會給我我想要的=(我將編輯上面的代碼以反映這個 – 2009-11-30 23:39:40

+0

與您的修復到位,如果我將鼠標移動到窗口的頂部,我得到一個黑色的三角形,這是三角形的紋理(排列在一個正方形),與三角形對着窗口的一側和光標是對角線下降到零的最後一個點,但是三角形點不跟隨光標並且行爲不正確取決於鼠標的位置 – 2009-11-30 23:41:59

+1

你可以做的最好的事情就是調試它,並確保在轉置之後最終得到的矩陣實際上是轉置矩陣。使用觀察窗查看並驗證。 – shoosh 2009-11-30 23:42:10

2

OpenGL和DirectX具有相反的矩陣表示,但他們也有相反的vector * matrix順序:

  • 的OpenGL:M * v。 M是在內存
  • 的DirectX列爲主:v * M。 M是內存中的主要行

由於乘法是相反的,你必須轉置你的OpenGL矩陣傳遞給DX。但是由於DX使用行專業,你必須再次轉置。轉置兩次確實是身份。

你怎麼樣儘量不轉變呢?

+0

我試過了,根本沒有得到預期的結果,我已經放棄並編寫了一個接口,其中包含directx矩陣API的directx實現 – 2009-12-01 12:22:58

0

你欣賞的是,2點矩陣你在上面顯示的,第一個是正確的DirectX矩陣。第二個不會在DX下工作...