在体素游戏引擎 (C#) 中围绕一个点旋转

Rotating about a Point in a Voxel Game Engine (C#)

我将继续构建基于 OpenTK 的基于体素的游戏引擎(OpenGL 的 .NET/Mono 绑定)。在此引擎中,有一个名为 Volume 的基本 class,它具有位置、旋转和缩放等特征,以及为动画编辑这些值的规则。

我将如何提供一个函数来旋转 一个点 关于 另一个点

我可以很容易地围绕其中心旋转对象(通过更改其旋转 属性),但是如果我需要对象 围绕原点旋转 space中的一个随机点? 这对于将块组合在一起很有用,因为我因此可以旋转对象,就好像它们粘在一起一样 - 而不是单独旋转。

我听说我需要深入研究并了解 旋转矩阵 ,但老实说这让我难以理解。到目前为止,我能找到的最接近的资源是 this link,但它详细说明了绕轴旋转。有人可以改编这些说明:或者更好的是,给我一个从位置和旋转点旋转的函数的基本伪代码?

编辑: 以下解决方案似乎不起作用。我的代码很简单:

void RotateAboutPoint(Vector3 point, Vector3 amount)
{
    v.Translate(point);
    v.Rotate(amount);
    v.Translate(-point);
}

这应该行得通吗?如果行不通,既然已经正确解释了情况,有人可以提供进一步的帮助吗? 据我所知,这也可能只是:

void RotateAboutPoint(Vector3 point, Vector3 amount)
{
    v.Rotate(amount);
}

这违背了围绕一个点执行此操作的目的。 这些坐标与对象无关...抱歉,如果我之前的解释不当使这不清楚!

我在这里回答了一个类似的问题:Rotating around a point different from origin

在作者提供的 link 中放置旋转步骤:

(1) Translate space so that the rotation axis passes through the origin.
(2) Rotate space about the z axis so that the rotation axis lies in the xz plane.
(3) Rotate space about the y axis so that the rotation axis lies along the z axis.
(4) Perform the desired rotation by θ about the z axis.
(5) Apply the inverse of step (3).
(6) Apply the inverse of step (2).
(7) Apply the inverse of step (1).

其实在这个过程中如果需要绕一个点旋转,(2),(3),(5),(6)是不需要的。如果您需要围绕一条线旋转对象,则需要执行这些步骤。

在你的情况下:假设你想围绕 (a,b)

旋转你的对象
  GL.pushmatrix();
  translate your object by (a,b);
  rotate your object;
  translate your object by (-a,-b);
  GL.popmatrix();

编辑: 对不起,我忘了添加你的旋转过程的封装。(它是在 post 上,但我给了 link)

更多信息:

这是什么封装?我们为什么需要这个?答案很简单。 OpenGL 存储一个 4x4 矩阵,它最初是一个单位矩阵。当您执行平移或旋转操作时,opengl 会更新您的矩阵,并在最终状态下将每个顶点与该矩阵相乘。 (如果你不执行任何操作,顶点与单位矩阵相乘得到相同的顶点坐标)

你的代码中的问题是当你没有对你的 rotation/translate 块应用封装时,场景中所有对象的最终矩阵都是相同的。通过封装,我们保证更新后的矩阵将仅在该块内使用。