【问题标题】:How to make gravity to center in Libgdx with box2d如何使用 box2d 使重力在 Libgdx 中居中
【发布时间】:2015-10-28 01:10:48
【问题描述】:

如何将重力设置到任何身体或屏幕中心?我想知道这是逻辑..

我有两个圆体aBody是staticBody,bBody是动态的,世界gravity(0,0)。

【问题讨论】:

  • 我猜你必须在每个滴答声中向每个身体添加一个朝向中心的力,因为力的方向取决于当前位置。
  • @Springrbua 你是对的,但如何? ://
  • 首先计算两点之间的归一化Vector。阅读here 如何做到这一点。然后将force 添加到身体,使用此Vector,乘以力量强度。你可以阅读如何做到这一点here

标签: android libgdx box2d gravity


【解决方案1】:

你所要做的就是施加一个力来模拟屏幕中心的重力(让我们想象在中心有一个非常重的物体会拉动其他物体)。

这个等式众所周知且易于实现 - look here to read about it。

有了方程,你只需要像这样实现它:

Body body, centerBody;
Vector2 center = new Vector2(0, 0);
...

//in render method
float G = 1; //modifier of gravity value - you can make it bigger to have stronger gravity

float distance = body.getPosition().dst( center ); 
float forceValue = G / (distance * distance);

// Vector2 direction = center.sub( body.getPosition() ) );
// Due to the comment below it seems that it should be rather:
Vector2 direction = new Vector2(center.x - body.getPosition().x, center.y - body.getPosition().y);

body.applyForce( direction.scl( forceValue ), body.getWorldCenter() );

当然你可以通过修改center Vector2来修改“重心”。

【讨论】:

  • 我认为这里有一个错误:center.sub() 修改中心向量并返回自身以进行链接,如文档中所述:link
  • @movAX13h 你是对的 - Vector2 是可变的,sub() 方法正在改变它的字段 - 似乎应该是 Vector2 direction = new Vector2(center.x - body.getPosition().x, center.y - body.getPosition().y) 但是我不确定我在这里的意思 - @ 987654328@ 向量似乎没有被我的代码更新,并且有这个centerBody 没有在任何地方使用......也许我的意思是应该使用这个centerBody.getPosition 而不是center 向量,然后centerBody由 World 更新... 5 年多过去了,我不记得说实话了... :) 还是谢谢你!
  • 对 ... 您可以使用 center.cpy().sub(body.getPosition()) ... cpy() 获取矢量对象的克隆并对其执行操作。
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 2014-03-08
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多