围绕轨道物体的轨道物体

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

其中角度是圆的当前旋转,半径是它与旋转中心的距离。

【讨论】:

这就是我一直在做的(极坐标公式),它只适用于绕太阳运行,但月球轨道随着每次迭代而增加。在答案中检查我的代码(我刚刚添加)。

以上是关于围绕轨道物体的轨道物体的主要内容,如果未能解决你的问题,请参考以下文章

团队项目记录2

最初按中心旋转时围绕点旋转对象

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

Unity中的Timeline

拉普拉斯局部极限定理怎么计算

如何使手动计算的轨道路径与Qt的椭圆绘制方法一致?