首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

DirectX 9 立方體紋理旋轉:修正旋轉中心點實現火焰紋理繞中心旋轉

     編輯:程式設計綜合問答

問題:使用 D3DXMatrixTranslation 平移 0.5 單位後再旋轉,期望紋理繞中心旋轉,但實際繞左上角旋轉,且平移偏移量無效果。

核心誤區:矩陣乘法順序與座標空間

DirectX 使用**行向量**慣例,向量在左、矩陣在右:v' = v * M。矩陣乘法順序為**從右向左**應用變換。代碼中:

texMtx = TranMtx * RotateMtx; // 實際順序:先旋轉,後平移

這導致:先繞原點 (0,0) 旋轉,再平移,所以旋轉中心始終是 (0,0) 左上角。

正確順序:先平移到中心、旋轉、再平移回原位

// 1. 平移 -0.5 將中心移至原點
D3DXMatrixTranslation(&T1, -0.5f, -0.5f, 0);
// 2. 旋轉
D3DXMatrixRotationZ(&R, time);
// 3. 平移 +0.5 移回原位
D3DXMatrixTranslation(&T2, 0.5f, 0.5f, 0);
// 組合:v' = v * T1 * R * T2
texMtx = T1 * R * T2; 

或使用 D3DXMatrixTransformation2D 直接指定中心點:

D3DXVECTOR2 center(0.5f, 0.5f);
D3DXMatrixTransformation2D(&texMtx, NULL, 0.0f, NULL, ¢er, time, NULL);

為何平移偏移量似乎無效果?

因錯誤順序導致平移發生在旋轉**之後**,視覺上表現為整體偏移而非改變旋轉中心。修正順序後,中心點固定,平移參數將正確控制旋轉軸心。

關鍵點總結

  • 矩陣乘法順序 = 變換應用的逆序。
  • 繞任意點旋轉 = 平移至原點 → 旋轉 → 平移回。
  • 紋理座標範圍 [0,1],中心為 (0.5, 0.5)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved