【问题标题】:Rotating entities (orbiting)旋转实体(轨道)
【发布时间】:2015-10-11 14:11:17
【问题描述】:

使用 C++ 和 SFML。我有三个实体。我们称它们为太阳、地球和月球。

首先是太阳,完全不动。 第二,地球,围绕太阳旋转,这似乎工作得很好。 最后,月球,它确实保持旋转到一个点,但似乎在绕地球做一个大椭圆,而不是绕地球做一般的旋转。当我真正停止地球自转时,月球自转良好。

我假设地球位置的变化正在影响月球应该如何旋转。

sf::Transform rotation;
rotation.rotate(mOrbitSpeed * dt.asSeconds(), mParent->getPosition());
sf::Vector2f positionAfterRotation = rotation.transformPoint(getPosition());
setPosition(positionAfterRotation);

行星的原点设置在中间,即 I.E.所以 getPosition() 也得到了行星的中心。获取位置返回 x 和 y 坐标。 mParent 将是轨道上的父母(即地球的太阳。)

有什么建议吗?谢谢!

【问题讨论】:

  • 您想要在地球参考系中的简单圆形轨道,但您在太阳参考系中进行旋转。我很惊讶你得到一个像椭圆形一样乖巧的结果。用地球的轨道运动绕太阳旋转月球,然后用月球的轨道运动绕地球旋转,你会没事的。

标签: c++ rotation sfml


【解决方案1】:

根据 Beta 上面所说的,上面的编码已经改变。不妨分享一下。

sf::Transform orbitalRotation;
orbitalRotation.rotate(mOrbitSpeed * dt.asSeconds(), mParent->getPosition());

if (mParent->mCanOrbit && mParent->mOrbitSpeed != 0.f)
    orbitalRotation.combine(mParent->getOrbitRotation());

sf::Vector2f positionAfterRotation = orbitalRotation.transformPoint(getPosition());
setPosition(positionAfterRotation);
mRotation = orbitalRotation;

这里所做的几乎就是我存储旋转并将其与父母旋转速度(如果有的话)结合起来。 mRotation 是一个保存的变量。您可能希望使用初始旋转值对其进行初始化,但除此之外它似乎在旋转。还对附有“迷你卫星”的月球进行了测试,它在三个深度处也能正常工作。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2021-05-15
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多