OpenGL 在进行自旋转时围绕对象旋转

Posted

技术标签:

【中文标题】OpenGL 在进行自旋转时围绕对象旋转【英文标题】:OpenGL rotation around an object while doing self rotation 【发布时间】:2016-11-12 09:41:50 【问题描述】:

我正在尝试使用可编程管道在 OpenGL 中模拟行星系统。假设现在我有一颗质心为planet_A_FixedPoint 的行星A 和一颗质心为planet_C_FixedPoint 的行星C。我想让行星 C 以旋转轴 = normalize(planet_A_FixedPoint) 围绕行星 A 旋转,同时以旋转轴 = (0,1,0) 围绕自己的中心旋转。我想出了以下代码,但它似乎不起作用。

glm::mat4 rotateAroundPlanetA = glm::translate(glm::mat4(), planet_A_FixedPoint) * glm::rotate(glm::mat4(), degree, normalize(planet_A_FixedPoint)) \
    * glm::translate(glm::mat4(), -planet_A_FixedPoint);
planet_C_M_Matrix = rotateAroundPlanetA * planet_C_M_Matrix;
glm::vec4 tempFixedPoint = rotateAroundPlanetA * glm::vec4(planet_C_FixedPoint, 1.0f);
planet_C_FixedPoint = vec3(tempFixedPoint.x, tempFixedPoint.y, tempFixedPoint.z);
glm::mat4 rotateAroundPlanetC = glm::translate(glm::mat4(), planet_C_FixedPoint) * glm::rotate(glm::mat4(), degree, vec3(0, 1, 0)) \
    * glm::translate(glm::mat4(), -planet_C_FixedPoint);
planet_C_M_Matrix = rotateAroundPlanetC * planet_C_M_Matrix;

以上代码实现的效果是行星C绕自身旋转,绕normalize(XA, YA, ZA)轴旋转,但是与行星A的原点(XA, YA, ZA)不对齐。

谁能告诉我哪里错了?

【问题讨论】:

请贴出你的真实代码,上面的sn-p连编译都编译不了。 嗨~我已经发布了我的真实代码。 【参考方案1】:

首先,如果您使用范围运算符 (::),请在任何地方使用它。 其次,您的代码具有预期的行为。如果你想让行星C与行星A的原点对齐,那么你的旋转轴需要是垂直平面,它包含原点C和原点A。

【讨论】:

垂直平面是什么意思? 对不起,我的意思是“旋转轴需要与平面正交......” 但现在的问题是行星 C 围绕预期的轴旋转,但中心位于原点 (0, 0, 0)。不是行星 A(XA、YA、ZA) 如果插入正确的轴而不是 normalize(planet_A_FixedPoint) 你的代码对我来说很好 但是如果我只有两个点,planetA 和 planetC,我如何获得飞机

以上是关于OpenGL 在进行自旋转时围绕对象旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenGL 中围绕 Z 轴中心旋转对象?

围绕对象旋转的矩阵乘法opengl

围绕世界轴OpenGL旋转对象

在OpenGL中围绕特定点旋转对象

opengl 围绕固定轴旋转对象

OpenGL 平移和旋转同时进行