在体素游戏引擎 (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 块应用封装时,场景中所有对象的最终矩阵都是相同的。通过封装,我们保证更新后的矩阵将仅在该块内使用。
我将继续构建基于 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 块应用封装时,场景中所有对象的最终矩阵都是相同的。通过封装,我们保证更新后的矩阵将仅在该块内使用。