Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将物体保持在行星表面的正确位置_C++_Box2d_Game Physics - Fatal编程技术网

C++ 将物体保持在行星表面的正确位置

C++ 将物体保持在行星表面的正确位置,c++,box2d,game-physics,C++,Box2d,Game Physics,我用Box2D模拟一个人在行星上行走。我计算了一个朝向行星中心的自定义重力,它工作正常,除了一个小问题:我使用的盒子作为人的物理模型,它在绕行星移动时旋转。我希望它总是正确的上升方向。你建议我怎么做 我考虑过当人的脚接触地面时,取重力向量并计算切向向量,但我不太确定怎么做。如果这是最好的办法,你能解释一下如何做到这一点吗?没有更简单的方法吗?有更简单的方法 我假设“向上走”的意思是脚应该始终指向行星 请执行以下操作: 将一个额外的圆形物体放置在与你的行星相同的位置(基本上是一个“在”你的行星内

我用Box2D模拟一个人在行星上行走。我计算了一个朝向行星中心的自定义重力,它工作正常,除了一个小问题:我使用的盒子作为人的物理模型,它在绕行星移动时旋转。我希望它总是正确的上升方向。你建议我怎么做


我考虑过当人的脚接触地面时,取重力向量并计算切向向量,但我不太确定怎么做。如果这是最好的办法,你能解释一下如何做到这一点吗?没有更简单的方法吗?

有更简单的方法

我假设“向上走”的意思是脚应该始终指向行星

请执行以下操作:

  • 将一个额外的圆形物体放置在与你的行星相同的位置(基本上是一个“在”你的行星内部的小圆圈)。这个身体既不应该与你的星球发生碰撞,也不应该与你的玩家发生碰撞
  • 通过旋转关节将这个身体连接到你的行星上,使它保持固定在相同的位置,但可以旋转
  • 通过棱柱关节将玩家连接到此身体,根据玩家相对于行星的起始位置设置轴(例如,如果玩家从行星顶部开始,则将轴设置为(0,1))
如果你这样做,棱柱关节应该注意保持你的球员旋转的方式你想要的

如果您喜欢手动设置角度,我认为您可以使用以下方法计算角度:

atan2(planetPos.y-playerPos.y,planetPos.x-playerPos.x)


这将以度为单位计算角度。您必须将其转换为弧度才能在Box2D中使用。

谢谢。这似乎是一个合理的解决方案,尽管我还没有尝试过。我现在选择了一个更三角的解决方案,因为当我们有多个“行星”在附近时,这似乎效果更好。