【问题标题】:How do I move a Rigidbody towards target without adding force or velocity?如何在不增加力或速度的情况下将刚体移向目标?
【发布时间】:2015-05-27 19:22:33
【问题描述】:

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

重要的是!它也可以在墙上反弹,这也降低了它的动量。

Unitys 内置的物理系统非常适合将东西扔到墙上并看到它以非常自然的方式弹跳,我想保留它但轻轻地将它推向目标。

我发现的大多数解决方案(特别是用于寻的导弹)都会增加持续的力,如果它们是自供电的,那就没问题了。

在此之前的脚本中,我会给球一个说... 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);   
}
}

如果有人有一些指示或建议,我将不胜感激。

非常感谢!

【问题讨论】:

  • 我认为您正在寻找一种叫做“脉冲”的物理东西。
  • 嗨,Almo,感谢您的评论。在固定更新中将力更改为脉冲 (targetDirection * tankShellSpeed, ForceMode.Impulse);不是我要找的。那仍然有完全相同的问题。我会在我的帖子中明确说明它已经添加了一种力量。

标签: c# unity3d game-physics


【解决方案1】:

如果我理解正确,您希望改变方向,而不是速度矢量的大小。您可以使用以下方法获得 3 维的当前大小:

double magnitude = Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y,2) + Math.Pow(z, 2));

然后,您可以将指向您的球和目标之间的单位向量乘以这个大小

编辑

向量的大小总是使用我在下面显示的公式来计算的。大小是向量的总长度,忽略方向。

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

此时你有你的幅度,这是你想走多快,还有你的单位向量,这是你想走的方向。将这 2 个值相乘会得到一个向量,该向量既是您想要前进的方向,又是您想要前进的速度。

【讨论】:

  • 好的,谢谢。这正是它。但是我使用了这个 Mathf.Sqrt(Mathf.Pow(ballRigidbody_gc.velocity.x, 2) + Mathf.Pow(ballRigidbody_gc.velocity.y,2) + Mathf.Pow(ballRigidbody_gc.velocity.z, 2));如果你能给我一个速成课程来说明为什么会这样,那就太好了,我不擅长数学。我不完全理解为什么我需要 3 维的量级而不是仅仅使用 ballRigidbody_gc.velocity.magnitude
  • @Jim 使用 velocity.magnitude 也应该可以工作。我没有意识到这是有问题的对象的价值(我对统一没有太多经验)
猜你喜欢
  • 1970-01-01
  • 2022-06-25
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多