【问题标题】:calculate orientation when rotating around circle绕圆旋转时计算方向
【发布时间】:2013-02-07 02:17:31
【问题描述】:

我最近在尝试使用 SFML 编写包含多个 sprite 的类时遇到了一个小问题。

我有一个包含多个 sprite 的容器,每个 sprite 可以从容器的中心点偏移缩放、旋转和位置。但是,我在尝试旋转容器时遇到了问题。如果我只是旋转单个精灵,它不会考虑它们与容器中心的偏移(对于某些用户界面位,这是一个问题)。经过一番挖掘,我发现了如何从中心获取它们的角度并计算它们在旋转时应该最终到达的位置。但是,我不知道如何保持它们的相对旋转相同。基本上,我希望能够做到这一点

旋转后是这个样子

由于 SFML 处理旋转和原点的方式,我不能只将每个精灵的原点设置为容器的中心并旋转。我需要某种函数来计算它们应该去的地方以及它们相对于它们已经拥有的方向应该具有的方向(所以如果精灵的角度为 0,当容器旋转 90 度时,它应该现在有一个 90 度的角度。虽然如果它从 90 度开始,它应该在之后旋转 180 度,以保持它相对于容器中其余精灵的旋转)

我用来获取旋转时相对于容器的位置的代码如下

float angle = atan2(p1.y -p2.y, p1.x - p2.x);
float x     = radius * cos(angle);
float y     = radius * sin(angle);

icon.set_position(x + spriteX, y + spriteY);

感谢阅读。我从来没有那么擅长数学,所以我不知道如何自己解决这个问题。在我开始研究这个问题之前,我什至不知道 cos 和 sin 在哪里 x.x 任何帮助将不胜感激。

【问题讨论】:

  • 查看组合转换:en.wikipedia.org/wiki/…。 SFML 提供了一个sf::Transformable 类,sf::Sprite 继承自该类。

标签: c++ visual-c++ trigonometry sfml


【解决方案1】:

你知道如何旋转精灵而不移动它的位置吗?如果是这样,只需将实际精灵本身旋转与您在上面的圆圈上定位时所获得的角度相同的角度。现在,您使用 sin 和 cos 旋转位置。您还需要按照您计算的相同角度设置“方向”:float angle = atan2(p1.y - p2.y, p1.x - p2.x);

祝你好运!

-p黑色

【讨论】:

  • 我不知道为什么我没有想到只是将精灵旋转完全相同的角度。它似乎工作得很好 x.x 谢谢。有时候我觉得自己很笨,哈哈。
【解决方案2】:

很简单,创建一个从容器中心点到精灵的向量。然后旋转矢量,你就有了新的精灵位置。

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 1970-01-01
    • 2011-10-13
    • 2017-10-10
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2021-05-04
    • 2020-10-02
    相关资源
    最近更新 更多