如何在不增加力或速度的情况下将刚体移向目标?
How do I move a Rigidbody towards target without adding force or velocity?
我有一个具有初始爆发力的球,将它发射到空中。理想情况下,这个球将能够在不断失去起始动量的同时转向它的目标。在朝着目标前进时,它不应该获得任何速度。
重要!它也可以在墙壁上弹跳,这也降低了它的动量。
Unitys 内置物理系统非常适合将东西扔到墙上并看到它以非常自然的方式反弹,我想保留它但轻轻地将它推向目标。
我发现的大多数解决方案(特别是针对制导导弹)都会增加持续的力,如果它们是自供电的,这很好。
在此之前的脚本中,我会给球一个力量,比如... 100 使用
ballRigidbody.Addforce(targetDirection, ForceMode.Impulse);
然后我希望使用 'Movement' class 来操纵它。
下面是不断加力推动球的例子,所以它更像火箭(不是我要的!)
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);
}
}
如果有人有任何指点或建议,我将不胜感激。
非常感谢!
如果我没理解错的话,你是想改变方向,而不是速度矢量的大小。您可以使用以下方法获取 3 个维度的电流大小:
double magnitude = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y,2) + Math.Pow(z, 2));
然后您只需将指向您的球和目标之间的单位向量乘以这个幅度
编辑
矢量的大小始终使用我在下面显示的公式计算。大小是矢量的总长度,忽略方向。
单位向量就是指向给定方向的向量,大小为 1。
在这一点上你有你的幅度,这是你想走多快,你的单位矢量,这是你想走的方向。将这 2 个值相乘得到一个向量,它是你想要去的方向和速度。
我有一个具有初始爆发力的球,将它发射到空中。理想情况下,这个球将能够在不断失去起始动量的同时转向它的目标。在朝着目标前进时,它不应该获得任何速度。
重要!它也可以在墙壁上弹跳,这也降低了它的动量。
Unitys 内置物理系统非常适合将东西扔到墙上并看到它以非常自然的方式反弹,我想保留它但轻轻地将它推向目标。
我发现的大多数解决方案(特别是针对制导导弹)都会增加持续的力,如果它们是自供电的,这很好。
在此之前的脚本中,我会给球一个力量,比如... 100 使用
ballRigidbody.Addforce(targetDirection, ForceMode.Impulse);
然后我希望使用 'Movement' class 来操纵它。
下面是不断加力推动球的例子,所以它更像火箭(不是我要的!)
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);
}
}
如果有人有任何指点或建议,我将不胜感激。
非常感谢!
如果我没理解错的话,你是想改变方向,而不是速度矢量的大小。您可以使用以下方法获取 3 个维度的电流大小:
double magnitude = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y,2) + Math.Pow(z, 2));
然后您只需将指向您的球和目标之间的单位向量乘以这个幅度
编辑
矢量的大小始终使用我在下面显示的公式计算。大小是矢量的总长度,忽略方向。
单位向量就是指向给定方向的向量,大小为 1。
在这一点上你有你的幅度,这是你想走多快,你的单位矢量,这是你想走的方向。将这 2 个值相乘得到一个向量,它是你想要去的方向和速度。