到达目的地时如何准确地停止子弹?

在下面的代码中,是我用来将子弹移动到其目的地的方法,并在子弹靠近目的地时停止。 但问题是子弹停止不准确,有时会有一个小的偏移或跨度或有时是准确的取决于角度。

public Vector2 getVelocity(Vector2 currentPosition, Vector2 targetPosition) { Vector2 targetDirection = targetPosition.cpy().sub(currentPosition); return targetDirection .nor(); } final float SPEED = 6; float pos = bulletPosition.len(); float des = bullet.destination.len(); float tol = Constants.TIME_STEP * SPEED; if(MathUtils.isEqual(pos,des, tol)) { body.setLinearVelocity(0,0); } else { body.setLinearVelocity(getVelocity(bulletPosition, destination).scl(SPEED)); } 

[解决了]

 if(MathUtils.isEqual(pos, des, tol)) { // quick & dirty way body.setTransform(destination, angle); // better way ... } 

快速和肮脏的方式:
你可以简单地传送子弹到你想要的位置后停止。

更长更好的方式:
对于最后一刻的移动,你可以通过lerp'ing (或任何其他方式,lerp是我最喜欢的)朝向目标来禁用物理和控制运动。 这样,你可以随时停止子弹。


编辑
我会在Unity中解决这样的情况,实际上这可能是比上面两个更好的方法:

 float minDisableDistance, minStopDistance, bulletSpeed; Transform target; // I'm skipping the parts that you create the bullet, and simply do the job on these: GameObject bullet; //Assuming this is the bullet. Rigidbody bulletRigidbody; //Assuming this is the rigidbody of bullet. void Update() { Vector3 relPos = target.position - bullet.postion; float distance = relPos.magnitude; if(distance > minDisableDistance) { //use physics. } else { bulletRigidbody.velocity = 0; if(distance > minStopDistance) { bullet.position += bulletSpeed * relPos.normalized * time.deltaTime; } else { bullet.position = target.position; } } } 

我find了最好的办法! 我只是使用Vector2 dst方法来获得目的地之间的距离。 而且万岁! 这是准确的!

 float distance = bulletPosition.cpy().dst(destination); float tol = (Constants.TIME_STEP * SPEED) / 2; if(distance <= tol) { body.setLinearVelocity(0, 0); }