我正在尝试使用可编程管道在OpenGL中模拟行星系统。假设现在我有一个行星A,其质心为planet_A_FixedPoint
,行星C的质心为planet_C_FixedPoint
。我想让行星C围绕行星A旋转,旋转轴= normalize(planet_A_FixedPoint)
,同时围绕自己的中心旋转,旋转轴= (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绕自身旋转并围绕标准化(XA,YA,ZA)轴旋转,但它不与行星A的原点(XA,YA,ZA)对齐。
谁能告诉我哪里错了?
答案 0 :(得分:1)
首先,如果你使用范围运算符(::)到处使用它。 其次,您的代码具有预期的行为。如果你想让行星C与行星A的原点对齐,那么你的旋转轴必须是垂直平面,它包含原点C和原点A.