我正在遵循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);
谢谢。
答案 0 :(得分:3)
flightDirection.Normalize()首先返回向量的长度,然后对其进行规范化。 在您的Java代码flightDirection.cpy()。nor()。len()中,您可以标准化然后返回的长度。将向量规范化后,其长度总是== 1(请参阅关于向量的操作)。
只需更改
flightDirection.cpy()。nor()。len()
对此
float flightSpeed = flightDirection.len()
flightDirection.nor()