gpt4 book ai didi

language-agnostic - 用矩阵变换3D向量的方法

转载 作者:行者123 更新时间:2023-12-05 00:06:44 26 4
gpt4 key购买 nike

我一直在阅读有关使用矩阵转换 Vector3 的内容,并且正在努力深入研究数学并自己编写代码而不是使用现有代码。无论出于何种原因,我的学校类(class)从未包括矩阵,所以我正在填补我的知识空白。谢天谢地,我只需要一些简单的东西,我想。

上下文是我正在为 RoboCup 3D league 编写一个机器人程序。 .我用 C# 编写它,但它必须在 Mono 上运行。理想情况下,我不会为此使用任何现有的图形库(WinForms/WPF/XNA),因为我真正需要的只是矩阵转换的一个整洁子集。

具体来说,我需要平移和 x/y/z 旋转,以及一种将多个变换组合成单个矩阵的方法。然后这将应用于我自己的 Vector3类型以生成转换后的 Vector3 .

我读过不同的建议。例如,some使用 4x3 矩阵对变换建模,others使用 4x4 矩阵。

此外,一些示例表明您需要向量矩阵的第四个值 1。当它包含在输出中时,这个值会发生什么?

[1 0 0 0]
[x y z 1] * [0 1 0 0] = [a b c d]
[0 0 1 0]
[2 4 6 1]

我缺少的部分是:

  • 我的矩阵应该是什么尺寸
  • 通过将变换矩阵相乘来合成变换
  • 使用结果矩阵转换 3D 向量

  • 因为我主要只是想让它运行,所以任何伪代码都会很棒。关于什么矩阵值执行什么转换的信息在许多页面上都非常清楚地定义,因此除非您非常热衷,否则无需在这里讨论:)

    最佳答案

    3 x 3 矩阵可以编码旋转和反射等变换,但不能编码平移。为此,您需要添加第四个元素并根据 homogenous coordinates 表示您的向量。 .出于某些目的可以使用非方阵,但如果您希望能够以任何顺序组合它们,它们应该是方阵(因为如果第一个矩阵的列数等于第二个中的行数)。

    因此,出于您的目的,您应该使用 4x4 矩阵和 4 元素齐次向量,添加值为 1 的第四个 w 坐标。

    对一堆向量应用变换只是相乘的问题。

    传统上,向量表示为 columns矩阵在左边。您在上面将它们表示为 rows并在右边乘以。两者都是有效的,但转换矩阵需要在两种情况之间进行转置。您显示的矩阵底部有平移值,这对于您的乘法顺序是正确的。

    向量转换后,您需要除以 w 坐标以将 x、y 和 z 缩放回传统的 3 空间。

    在 C-ish 伪代码中,使用行向量约定:

    Vector transform (Vector v, Matrix m)
    {
    Vector result;
    for ( int i = 0; i < 4; ++i )
    result[i] = v[0] * m[0][i] + v[1] * m[1][i] + v[2] + m[2][i] + v[3] * m[3][i];
    result[0] = result[0]/result[3];
    result[1] = result[1]/result[3];
    result[2] = result[2]/result[3];
    return result;
    }

    可以通过将每个矩阵的矩阵依次相乘来组成一系列变换。注意矩阵乘法是 不可交换 ,所以乘法的顺序很重要。反过来,这意味着您是将左侧的行向量相乘还是右侧的列相乘很重要。如果乘以 一个 x x C ,然后使用与执行转换相同的列向量 C 先,然后 ,然后终于 一个 .对于行向量,它是 一个 先,然后 然后 C .因此,在构建、组合和应用转换时保持所有内容的一致性非常重要。

    同样,在应该与 transform 一致的伪代码中以上:
    Matrix compose (Matrix first, Matrix second)
    {
    Matrix result;
    for ( int i = 0; i < 4; ++i )
    for ( int j = 0; j < 4; ++j )
    result[i][j] = first[i][0] * second[0][j]
    + first[i][1] * second[1][j]
    + first[i][2] * second[2][j]
    + first[i][3] * second[3][j];
    return result;
    }

    关于language-agnostic - 用矩阵变换3D向量的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2944670/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com