【问题标题】:Vector3 Matrix MultiplicationVector3 矩阵乘法
【发布时间】:2012-10-04 16:31:15
【问题描述】:

假设我们有:

Vector3 vec;//has some random values
Matrix4x4 mat;//has some random values as well

现在我想将它们相乘以从中得到一个 Vector3。

Vector3 mult = vec * mat;

这个函数能实现吗:

void Matrix4x4::Transform( Vector3 &oPoint )
{
    float fX = oPoint.GetX();
    float fY = oPoint.GetY();
    float fZ = oPoint.GetZ();

    oPoint.SetX( fX * this->matrix[0][0] + fY * this->matrix[0][1] + fZ * this->matrix[0][2] + this->matrix[0][3]);
    oPoint.SetY( fX * this->matrix[1][0] + fY * this->matrix[1][1] + fZ * this->matrix[1][2] + this->matrix[1][3]);
    oPoint.SetZ( fX * this->matrix[2][0] + fY * this->matrix[2][1] + fZ * this->matrix[2][2] + this->matrix[2][3]);
}

如果没有,你能引导我走向正确的方向吗?

【问题讨论】:

  • 您当然可以编写使用它的代码。但是,如果将 Matrix4x4 视为 3x3 矩阵,为什么要以 4x4 命名呢?
  • @PeteBecker:可能是因为它用于与 3 向量相乘。从数学上讲,这个操作没有定义。为此,您需要一个行秩为 3 的矩阵,即 3×n 矩阵。然而,我们可以简单地定义我们考虑的所有向量和矩阵都是无限秩的,并且在给定元素数量之后的所有内容都是 0。在这种情况下,在 3→4 乘法中,隐式第 4 个元素为零并匹配 OP 给出的代码.
  • @datenwolf - 是的,当然。但这并没有说明这样做是否合适,或者 Jose 是否打算这样做。
  • 我理解你为什么说它是 3x3,因为我做的最后一次操作总是为零。但我想要的只是我从这里得到的向量是正确的,既然你说它是正确的,那就好了。谢谢大家的回复。

标签: c++ vector matrix-multiplication


【解决方案1】:

您的代码似乎没问题。我假设,当您使用 OpenGL 时,您的矩阵按列优先顺序排列,并且当您想在 4x4 矩阵上乘以大小为 3 的向量时,您的第四个向量坐标是1

但是,由于您显然是在做计算机图形,因此您应该使用大小为 4 的向量,因为坐标是齐次的。我也不太明白,为什么要在矩阵上乘向量,反之亦然。

【讨论】:

  • 第四个坐标w确实很重要。当它不为零时,4 向量表示坐标为 (x/w, y/w, z/w) 的 3d 点(这就是设置 w = 1 的原因),当 w 为零时,它表示方向 v = 上“无限远”的点(x, y, z)。至于“反之亦然”部分,它取决于约定(iirc DirectX 和 OpenGL 在这方面有所不同),因此表示投影点的向量是否被视为行或列。
  • 好吧,我正在为 Collada 制作动画,我需要将一个向量和矩阵相乘并从中得到一个向量。我被动画卡住了,但那是一个不同的问题,如果我不尽快得到它,可能会在稍后发布。但无论如何,如果它看起来不错,那么就可以了。感谢回复
猜你喜欢
  • 2018-04-11
  • 2017-03-11
  • 2013-12-23
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多