围绕Voxel游戏引擎中的一个点旋转(C#)

时间:2015-02-20 23:05:50

标签: c# opengl 3d opentk rotational-matrices

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

我如何提供一个功能来旋转一点关于另一个点

我可以很容易地围绕它的中心旋转一个物体(通过改变它的旋转属性),但是如果我需要物体旋转原点空间中的随机点?< / em>这对于将块分组在一起非常有用,因为我可以将对象旋转到一起 - 就像它们被粘在一起一样 - 而不是它们单独旋转。

我听说我需要深入了解旋转矩阵,但老实说它已经过了我的脑海。到目前为止,我能找到的最近的资源是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);
}

在一个点上击败了执行此操作的目标。 这些坐标与对象无关......对不起,如果我的不良解释之前不清楚这一点!

1 个答案:

答案 0 :(得分:0)

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

在您提供的链接中,作者提出了轮换步骤:

(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();

修改 对不起,我忘了添加你的轮换过程的封装。(这是在我发布链接的帖子上)

更多信息:

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

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