围绕轨道物体的轨道物体
Posted
技术标签:
【中文标题】围绕轨道物体的轨道物体【英文标题】:Orbiting object around orbiting object 【发布时间】:2013-11-14 22:53:43 【问题描述】:我如何进入绿色环绕橙色和蓝色环绕绿色的轨道?
我找到了许多解决方案,可以很好地围绕静态点旋转(在这种情况下是橙色圆圈),但没有找到任何适用于静态点和移动点的好的数学方程。
angle += sunRot;
if(angle > 360.0f)
angle = 0.0f;
float radian = glm::radians(angle);
float radius = glm::distance(position, rotCenter);
float x = rotCenter.x + (radius * cosf(radian));
float z = rotCenter.z + (radius * sinf(radian));
glm::vec3 newPos = glm::vec3(x, 0, z);
setPosition(newPos);
Here is 我正在努力实现的目标(感谢@George Profenza 分享链接)
【问题讨论】:
您需要做的就是以正确的顺序转换每个对象。您将首先围绕橙色对象旋转绿色对象以获取其位置。然后使用绿色对象的位置并围绕它旋转蓝色对象。它们具有完美的圆形轨道,因此您可以将它们平移到距它们所环绕的物体中心的固定距离处。 你需要什么like this吗? @peter-wood ,不,我只是尝试模拟地球绕太阳旋转和月亮绕地球旋转。 【参考方案1】:尽可能基于当前对象的半径和角度进行所有计算,并将半径和角度与对象一起存储。
特别是,不要在每次迭代中根据 x/y 坐标计算半径:如果基础对象在步骤之间移动,您计算的半径会稍微偏离,误差会累积。
【讨论】:
这就是问题所在 :) 现已修复!谢谢!【参考方案2】:您应该能够使用 opengl 使用 glPushMatrix()
、glPopMatrix()
调用来嵌套坐标空间。 Here 是一个基本示例(按鼠标查看坐标空间)。
语法不是 c++,但很容易理解我的意思。
您可以通过多种方式做到这一点:
-
极坐标公式
手动乘法变换矩阵
只需使用 push/pop 矩阵调用(以及在需要的地方进行平移/旋转),即可在幕后为您执行矩阵乘法。
以防万一你想试试极坐标公式:
x = cos(angle) * radius
y = sin(angle) * radius
其中角度是圆的当前旋转,半径是它与旋转中心的距离。
【讨论】:
这就是我一直在做的(极坐标公式),它只适用于绕太阳运行,但月球轨道随着每次迭代而增加。在答案中检查我的代码(我刚刚添加)。以上是关于围绕轨道物体的轨道物体的主要内容,如果未能解决你的问题,请参考以下文章