为什么这个XMVector3Transform调用没有返回正确的结果?

时间:2013-11-30 16:30:44

标签: c++ vector matrix 3d directx

情况如下:

XMVECTOR posVec = XMLoadFloat3(&(pVertexInfos[j].pos));

// At this point posVec equals {6143.72119, -714.767151, -16615.9004, 0.000000000} 
// and new newModelMatrix's rows are as follows:
// Row 0: {1.00000000, 0.000000000, 0.000000000, 0.000000000}
// Row 1: {0.000000000, 0.000000000, -1.00000000, 0.000000000} 
// Row 2: {0.000000000, 1.00000000, 0.000000000, 0.000000000}
// Row 3: {0.000000000, 0.000000000, 0.000000000, 1.00000000}

posVec = XMVector3Transform(posVec, newModelMatrix);

// But then posVec equals **{6143.72119, -16615.9004, 714.767151, 1.00000000}** 

根据我重复的铅笔和纸张计算(汗学院证实我做得对)以及正确的程序执行应该等于 {6143.72119,16615.9004,-714.767151,1.0000000000} < / p>

以防万一我疯了,以下是调试器的屏幕截图: Debugger before op

之后: Debugger after op

那么这里发生了什么?根据我的研究,XMVector3Transform应该正是我想要的,这是Matrix times Vector = Vector,但由于某种原因,看起来负面的迹象搞砸了。你可以想象,这会在应用程序中导致一个非常糟糕的视觉错误(我确认正确地破解操作可以解决问题)。

提前感谢您的帮助, 尼科

1 个答案:

答案 0 :(得分:1)

您获得的结果似乎没有任何问题。

您设置的矩阵采用一个位置(X,Y,Z)并将其乘以一个矩阵,该矩阵交换Y和Z轴并取消产生的Z.

当您通过矩阵乘以向量时,您一次跨过一列并向下工作,而不是沿着行,就像使用矩阵乘法一样。

结果计算应为:

X = (6143.72119 * 1.0f) + (-714.767151 * 0.0f) + (-16615.9004 * 0.0f) = 6143.72219

Y = (6143.72119 * 0.0f) + (-714.767151 * 0.0f) + (-16615.9004 * 1.0f) = -16615.9004

Z = (6143.72119 * 0.0f) + (-714.767151 * -1.0f) + (-16615.9004 * 0.0f) = 714.767151

这正是函数给你的功能。也许你只是误解了如何进行矢量/矩阵乘法?