問題:使用 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);
因錯誤順序導致平移發生在旋轉**之後**,視覺上表現為整體偏移而非改變旋轉中心。修正順序後,中心點固定,平移參數將正確控制旋轉軸心。