Libgdx 中的 Arrow Box2d Physic
Arrow Box2d Physic in Libgdx
我正在跟随 this tutorial 在 Libgdx 中创建箭头物理。但是我的箭头工作起来很奇怪,我怀疑我对阻力的计算是造成问题的原因……我不熟悉 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);
谢谢。
flightDirection.Normalize() 首先是向量的 returns 长度,然后对其进行归一化。
在您的 java 代码 flightDirection.cpy().nor().len() 中,您标准化了当时的 return 长度。归一化向量后,它的长度始终为 == 1(请阅读有关向量的操作)。
只需更改此
flightDirection.cpy().nor().len()
至此
float flightSpeed = flightDirection.len()
flightDirection.nor()
我正在跟随 this tutorial 在 Libgdx 中创建箭头物理。但是我的箭头工作起来很奇怪,我怀疑我对阻力的计算是造成问题的原因……我不熟悉 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);
谢谢。
flightDirection.Normalize() 首先是向量的 returns 长度,然后对其进行归一化。 在您的 java 代码 flightDirection.cpy().nor().len() 中,您标准化了当时的 return 长度。归一化向量后,它的长度始终为 == 1(请阅读有关向量的操作)。
只需更改此
flightDirection.cpy().nor().len()
至此
float flightSpeed = flightDirection.len()
flightDirection.nor()