Libgdx中的Arrow Box2d Physic

时间:2019-03-19 05:54:04

标签: libgdx box2d

我正在遵循this tutorial在Libgdx中创建箭头物理。但是我的箭头如此奇怪,以至于我怀疑我对dragforce的计算是造成问题的原因。...我不熟悉C ++编程,而且我真的不知道我在哪里做错了。

谁能帮我检查我的错误在哪里?

教程代码(C ++):

  b2Vec2 pointingDirection = arrowBody->GetWorldVector( b2Vec2( 1, 0 ) );
  b2Vec2 flightDirection = arrowBody->GetLinearVelocity();
  float flightSpeed = flightDirection.Normalize();//normalizes and returns length

  float dot = b2Dot( flightDirection, pointingDirection );
  float dragForceMagnitude = (1 - fabs(dot)) * flightSpeed * flightSpeed * dragConstant * arrowBody->GetMass();

  b2Vec2 arrowTailPosition = arrowBody->GetWorldPoint( b2Vec2( -1.4, 0 ) );
  arrowBody->ApplyForce( dragForceMagnitude * -flightDirection, arrowTailPosition );

我的代码(java):

pointingDirection = body.getWorldVector(arrowPoitningDirection);
flightDirection = body.getLinearVelocity();
float flightSpeed = flightDirection.cpy().nor().len();//normalizes and returns length

float dot = Vector2.dot(flightDirection.x,flightDirection.y,pointingDirection.x,pointingDirection.y);
float dragCons = 0.5f;
float dragForceMagnitude = (1 - Math.abs(dot)) * flightSpeed * flightSpeed * dragCons * body.getMass();

arrowTailPos = body.getWorldPoint(arrowTailPointingPos);
body.applyForce( flightDirection.scl(dragForceMagnitude) , arrowTailPos, false);

谢谢。

1 个答案:

答案 0 :(得分:3)

flightDirection.Normalize()首先返回向量的长度,然后对其进行规范化。 在您的Java代码flightDirection.cpy()。nor()。len()中,您可以标准化然后返回的长度。将向量规范化后,其长度总是== 1(请参阅关于向量的操作)。

只需更改

flightDirection.cpy()。nor()。len()

对此

float flightSpeed = flightDirection.len()

flightDirection.nor()