Unity3D:碰撞后获取速度
Unity3D: Get Velocity after collision
我正在制作台球游戏,有两个问题:
如何找到两个球相互碰撞时的速度以及如何将其应用于两个球?
我已经知道它们要移动的角度,我只需要找到它们在这些方向上移动的速度。
我从来都不擅长 physics/physics 编程,所以如果能提供任何帮助,我将不胜感激!顺便说一句,我的游戏是 3D 的。
感谢您的宝贵时间!
编辑:我想做的是使移动方向与我使用此脚本计算的方向相匹配:
if (Physics.Raycast(ray, out hit, Mathf.Infinity, lmm))
{
location = new Vector3(hit.point.x, 1.64516f, hit.point.z);
}
if (Physics.SphereCast(transform.position, 0.77f, location - transform.position, out hitz, Mathf.Infinity, lmm2))
{
if (hitz.collider.tag == "Ball")
{
Vector3 start = hitz.point;
end = start + (-hitz.normal * 4);
lineRenderer2.SetPosition(1, end);
}
}
如果我没理解错的话,你要做的是将 "Ball A" 的速度作为力作用于 "Ball B",反之亦然。如果是这样的话,我会建议这样的事情:
将此脚本附加到所有球:
public class BallCollisionScript : MonoBehaviour
{
public Rigidbody Rigid_Body;
void Start()
{
Rigid_Body = this.GetComponent<Rigidbody>();
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag.Equals("Ball"))
{
BallScript otherBall = collision.gameObject.GetComponent<BallScript>();
Rigid_Body.AddForce(otherBall.Rigid_Body.velocity);
}
}
}
确保所有球都标记有 "Ball"。
您可以通过对每个球施加脉冲来计算新的速度。我们可以应用牛顿第三定律来做到这一点。伪代码:
RelativeVelocity = ball1.velocity - ball2.velocity;
Normal = ball1.position - ball2.position;
float dot = relativeVelocity*Normal;
dot*= ball1.mass + ball2.mass;
Normal*=dot;
ball1.velocity += Normal/ball1.mass;
ball2.velocity -= Normal/ball2.mass;
然而,这并没有考虑两个球之间的摩擦力,也没有考虑它们的 angular 动量。
我正在制作台球游戏,有两个问题:
如何找到两个球相互碰撞时的速度以及如何将其应用于两个球?
我已经知道它们要移动的角度,我只需要找到它们在这些方向上移动的速度。
我从来都不擅长 physics/physics 编程,所以如果能提供任何帮助,我将不胜感激!顺便说一句,我的游戏是 3D 的。
感谢您的宝贵时间!
编辑:我想做的是使移动方向与我使用此脚本计算的方向相匹配:
if (Physics.Raycast(ray, out hit, Mathf.Infinity, lmm))
{
location = new Vector3(hit.point.x, 1.64516f, hit.point.z);
}
if (Physics.SphereCast(transform.position, 0.77f, location - transform.position, out hitz, Mathf.Infinity, lmm2))
{
if (hitz.collider.tag == "Ball")
{
Vector3 start = hitz.point;
end = start + (-hitz.normal * 4);
lineRenderer2.SetPosition(1, end);
}
}
如果我没理解错的话,你要做的是将 "Ball A" 的速度作为力作用于 "Ball B",反之亦然。如果是这样的话,我会建议这样的事情:
将此脚本附加到所有球:
public class BallCollisionScript : MonoBehaviour
{
public Rigidbody Rigid_Body;
void Start()
{
Rigid_Body = this.GetComponent<Rigidbody>();
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag.Equals("Ball"))
{
BallScript otherBall = collision.gameObject.GetComponent<BallScript>();
Rigid_Body.AddForce(otherBall.Rigid_Body.velocity);
}
}
}
确保所有球都标记有 "Ball"。
您可以通过对每个球施加脉冲来计算新的速度。我们可以应用牛顿第三定律来做到这一点。伪代码:
RelativeVelocity = ball1.velocity - ball2.velocity;
Normal = ball1.position - ball2.position;
float dot = relativeVelocity*Normal;
dot*= ball1.mass + ball2.mass;
Normal*=dot;
ball1.velocity += Normal/ball1.mass;
ball2.velocity -= Normal/ball2.mass;
然而,这并没有考虑两个球之间的摩擦力,也没有考虑它们的 angular 动量。