0

我对我的问题在这里感到非常困惑。我已经建立了一个矩阵,它将全局/世界坐标转换为对象的局部坐标空间。该转换矩阵是使用来自四个向量(向前、向上、侧面和位置)的对象信息构建的。然后在每个对象的绘制时将此定位矩阵传递给glMultMatrixf(),以便我可以围绕每个对象绘制一个简单的轴以可视化局部坐标系。这完全可以正常工作并且符合预期,并且随着对象在世界中移动和旋转,它们的局部坐标轴也是如此。

问题是,当我采用相同的矩阵并将其乘以列向量(将一个对象的全局位置转换为另一个对象的局部坐标系)时,结果与我预期的完全不同。例如:

我的本地化矩阵如下:

0.84155    0.138      0.5788     0
0.3020     0.8428    -0.5381     8.5335
0.4949    -0.5381    -0.6830    -11.6022
0.0        0.0        0.0        1.0

我输入位置列向量:

-30.0
-30.0
-30.0
1.0

并获得以下输出:

-99.2362
-1.0199
4.8909
1.0000

由于我的对象此时的位置是 (-50.8, 8.533, -11.602, 1),我知道 x 坐标的输出不可能像 -99.2362 一样大。此外,当我找到两个全局点之间的距离以及局部点与原点之间的距离时,它们是不同的。

我已经在 Matlab 中检查了这一点,看来我的矩阵乘法是正确的(注意:在 Matlab 中,您必须首先转置本地化矩阵)。所以我认为我的本地化矩阵没有正确构造 - 但是OpenGL成功地使用这个矩阵来绘制局部坐标轴!

我试图在这个问题中不包括不必要的细节,但如果你觉得你需要更多,请不要犹豫,问!:)

非常感谢。

4

1 回答 1

1

我不得不猜测,但我想指出 OpenGL 矩阵乘法的两个问题来源:

  1. 模型视图矩阵转换为一个坐标系,其中相机始终位于沿 z 轴的原点 (0,0,0)。因此,如果您在应用局部-> 全局转换之前进行了一些转换以“移动相机”,则必须补偿相机移动,否则您将获得相机坐标空间的局部坐标。构建矩阵时是否包括相机变换?

  2. OpenGL 中的矩阵主要是 COLUMN。如果您有一个包含 16 个值的数组,则元素将按以下方式排序:

    [0][4][8][12]

    [1][5][9][13]

    [2][6][10][14]

    [3][7][11][15]

你的矩阵也似乎很奇怪。前三列告诉我,您应用了一些旋转或缩放变换。最后一列显示了应用于每个坐标元素的平移量。这些数字与您的对象的位置相同。这意味着,如果您希望输出 x 坐标为 -50.8,则第一行中的前三个元素加起来应为零:

-30*0.8154 -30*0.3020 -30*0.4939 + 1 * -50.8967

<---这应该是零--------> 但是是-48,339。

所以我认为,构造矩阵时确实存在问题。也许您可以解释如何构造矩阵...

于 2011-03-07T20:16:19.137 回答