如何在不增加力或速度的情况下将刚体移向目标?

时间:2015-05-27 19:22:33

标签: c# unity3d game-physics

我有一个初始爆发力的球,将它发射到空中。理想情况下,这个球能够朝着目标转向,同时不断失去起始动力。朝向目标时不应该获得任何速度。

重要!它也可以反弹到墙壁上,这也减少了它的动力。

建立在物理系统中的Unity很适合在墙壁上扔东西,看到它以非常自然的方式弹跳,我想保留它,但是要轻轻地将它推向目标。

我发现的大多数解决方案(特别是用于导弹的导弹)会增加一定的力量,如果它们是自供电的话,这是很好的。

在此之前的一个剧本中,我会使用

给球说力...... 100
ballRigidbody.Addforce(targetDirection, ForceMode.Impulse);

然后我希望使用'运动'课来引导它。

下面是一个通过不断增加力量推动球的例子,所以它更像火箭(不是我想要的!)

public class Movement : MonoBehaviour {

[Header("Get Components")]
[SerializeField]Transform targetTransform_gc;
[SerializeField]Transform ballTransform_gc;
[SerializeField]Rigidbody ballRigidbody_gc;
[Header("Settings")]
public float turnSpeed;
public float ballSpeed;
//Private
private Vector3 targetDirection;
private Quaternion targetRotation;


void Update () {
    targetDirection = targetTransform_gc.position -ballRigidbody_gc.position;    
    targetDirection.Normalize();
    targetRotation = Quaternion.LookRotation(ballRigidbody_gc.velocity);
    ballTransform_gc.rotation = Quaternion.Slerp (ballTransform_gc.rotation, targetRotation , turnSpeed * Time.deltaTime);  
}   
void FixedUpdate(){
    ballRigidbody_gc.AddForce(targetDirection * ballSpeed);
    ballRigidbody_gc.velocity = new Vector3(ballRigidbody_gc.velocity.x, 0, ballRigidbody_gc.velocity.z);   
}
}

如果有人提出一些建议或建议,我将非常感激。

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您正在寻找方向,而不是速度向量的大小。您可以使用以下方法获得3维的当前幅度:

double magnitude = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y,2) + Math.Pow(z, 2));
然后,你可以将你的球和目标之间的单位矢量乘以这个数量

修改

矢量的大小始终使用下面显示的公式I计算。幅度是矢量的总长度,忽略方向。

单位向量只是指向给定方向的向量,其大小为1.

此时你有你的震级,即你想要的速度,你的单位矢量,你想去的方向。将这两个值相乘可得到一个向量,它既是您想要的方向,也是您想要的速度。