【问题标题】:Translate vector by matrix通过矩阵转换向量
【发布时间】:2009-09-30 20:24:40
【问题描述】:

我有一个 4*4 矩阵和一个 3d 向量。 我需要用矩阵转换我的向量。

请不要太疯狂的数学符号,因为我不明白。

类似 java 的例子就是 fab!

【问题讨论】:

  • 您不能通过矩阵转换向量。你可以将一个向量乘以一个矩阵......你是这个意思吗?
  • 我认为他想要通过矩阵乘法进行平移变换。
  • 向量需要扩展(到 4 维)或者矩阵需要松散一行,以便将矩阵乘以向量...
  • mjv:3D 向量的 4×4 矩阵是正常的。这些被称为齐次坐标。但是,是的,向量为此进行了扩展,但它真的不是四维的,那么
  • 听起来像是 Graphics I 中的一项作业,答案应该在 Graphics I 的书中,或者无论如何快速谷歌。

标签: java vector matrix 3d


【解决方案1】:

看过之后就很容易了。

(New-3d-point) = Metrix-4x4 x (Old-3d-point)

意思是……

|x_new|   |a1 a2 a3 a4|   |x_old|
|y_new| = |b1 b2 b3 b4| x |y_old|
|z_new|   |c1 c2 c3 c4|   |z_old|
|  1  |   |d1 d2 d3 d4|   |  1  |

意思是……

x_new = a1*x_old + a2*y_old + a3*z_old + a4
y_new = b1*x_old + b2*y_old + b3*z_old + b4
z_new = c1*x_old + c2*y_old + c3*z_old + c4

d1-d4 是用来制作“1”的,所以你不需要使用它。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    不过,你需要数学。我会尽量温柔,但如果你不知道如何做矩阵乘法,你需要马上查一下!

    首先,您需要将 3D 向量添加为 4 向量,方法是在其中添加一个额外的 1。计算机图形学通常将此称为“w”坐标(与 x、y 和 z 坐标一起使用)。

    3D 向量:(X,Y,Z) -> 4D 向量:(x=X, y=Y, z=Z, w=1)

    然后,您可以将 4 向量乘以 4x4 矩阵。这取决于矩阵 - 但您可以制作一个转换向量的矩阵:

    [x,y,z,1] * [1 0 0 0]  =  [x+a,y+b,z+c,1]
                [0 1 0 0]
                [0 0 1 0]
                [a b c 1]
    

    不出所料,这种矩阵称为平移矩阵。

    这样做的好处是你还可以制作一个旋转矩阵,或者一个缩放矩阵,然后你可以将任意数量的它们相乘成一个矩阵: p>

    v * M1 * M2 * M3 = v * (M1*M2*M3)
    

    将一个向量乘以得到的矩阵相当于乘以顺序的所有分量矩阵,正如您想象的那样,这可以为您节省大量时间和麻烦。


    将 4 向量乘以 4x4 矩阵的代码可能类似于:

    for(int i=0; i<4; ++i) {
      double accumulator= 0.0;
      for(int j=0; j<4; ++j) {
        accumulator+= rowVectorIn[j]*matrix[j][i]; // matrix is stored by rows
      }
      rowVectorOut[i]= accumulator;
    }
    

    【讨论】:

      【解决方案3】:

      如果您将(通常为 3d)向量 (x, y, z) 视为四向量 (x, y, z, 1),您可以这样做:w = AvT,其中 T 是转置操作(垂直扭曲水平向量,反之亦然),A 是正确选择的矩阵,w 是转换后的矩阵矩阵。

      你必须知道如何进行矩阵乘法。

      要获得(a, b, c) 的转置,没有其他定义A 为:

      1  0  0  a
      0  1  0  b
      0  0  1  c
      0  0  0  1
      

      【讨论】:

        【解决方案4】:

        我不确定您的数据究竟是什么形式的,但乍一看,您可能正在处理quaternions

        无需深入研究数学,有几种方法可以表示 3 维矩阵变换。有欧拉角和四元数。欧拉角肯定更简单,但四元数的优点是不易受到万向锁的影响。

        三维实数值的四元数用 4x4 矩阵表示,这就是我认为这可能适用于您的原因。当然,其他解决方案的作者可能是对的,您所处理的可能完全不同,但无论如何可能值得学习。

        希望这会有所帮助。祝你好运!

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 2016-08-08
        • 2016-07-18
        • 2021-04-29
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多