4

我正在尝试为游戏实现 4D 网格。但是,我发现了一个小问题,我不知道如何在 4 维空间中旋转物体。

我浏览了互联网,发现了以下二维:

2D 旋转

以及 3 维的以下内容:

3D 旋转

但是,当我在 4D 中搜索事物时,我没有找到有很好答案的人,他们的矩阵显示了要执行的确切转换。

我正在编写的代码是用 C# 编写的,但是我的目标是让这篇文章对每个人都有用,所以我不会在这里发布任何代码(也因为我现在没有实际的轮换代码)。

点(顶点)当前表示为 4 个浮点值(x、y、z、w)。旋转可以以您喜欢的任何方式表示。

如果有人对一些矩阵或不同的方式有很好的解释谢谢!

4

3 回答 3

3

好吧,回答并获得赏金的人是错误的,我不想只是旋转 180 度 -_- 。90 怎么样,45 怎么样,69.420 或 3.432434 怎么样?我们也需要知道这一点。

所以我昨天确实自己弄清楚了。你只要选择一个平面,比如xy,就表示zw坐标会发生变化。现在使用 2D 矩阵来旋转这些点。对每个轴执行此操作,总共 6 个才能围绕每个轴旋转。

于 2019-11-25T11:30:43.753 回答
0

我认为您的意思是如何旋转在齐次坐标中定义的点(具有 4 个值)。这是按如下方式完成的:

腐烂

用 0 和 1填充常规的 3×3 旋转矩阵R以获得 4×4 旋转矩阵。

如果您想(dx,dy,dz)在旋转之前将平移与平移相结合,则将平移向量添加到最后一列

rot2

上面用常规的 3×1 向量展开如下

rot3

于 2019-11-25T17:09:19.900 回答
-2

就地旋转意味着您修改矩阵本身,而不创建新矩阵。但是,如果您要旋转 90 度,则当然只能在矩阵为正方形时就地旋转。但是,如果您旋转 180 度,则始终可以就地旋转。让我们看一个非方阵:

{ a, b, c, d, e, f },
{ g, h ,i, j, k, l },
{ m, n, o, p, q, r }

如果我们将它旋转 180 度,我们最终会得到:

{ r, q, p, o, n, m },
{ l, k, j, i, h, g },
{ f, e, d, c, b, a }

您可以看到 [r, c] 处的项目以 [#rows - r - 1, #columns - c - 1] 结束。(当然是从 0 开始的),所以 [0, 1] 处的 b 结束于 [3 - 0 - 1, 6 - 1 - 1]

您可以使用的方法是:首先交换 a 和 r,然后交换 b 和 q,等等。这类似于反转 1 维数组,只是在 2 维中。就像反转一维数组一样,我们只进行了一半:我们交换的最后两项是 i 和 j。我使该方法通用,因此您可以使用它旋转任何矩阵。

static void Rotate180<T>(T[,] matrix) {
    int rowCount = matrix.GetLength(0), columnCount = matrix.GetLength(1);
    int max = rowCount * columnCount / 2, m = 0;
    for (int r = 0; ; ++r) {
        for (int c = 0; c < columnCount; ++c) {
            Swap(matrix, r, c, rowCount - r - 1, columnCount - c - 1);
            if (++m >= max) return;
        }
    }
}

static void Swap<T>(T[,] matrix, int r1, int c1, int r2, int c2) {
    T temp = matrix[r1, c1];
    matrix[r1, c1] = matrix[r2, c2];
    matrix[r2, c2] = temp;
}
于 2019-11-24T15:25:45.940 回答