2D 弹跳公式无法正常工作
2D bouncing formula doesn't work properly
我是 unity 的新手,我正在尝试创建一个弹跳球,所以我对弹跳相关物理做了很多研究,我找到了一个公式:
公式:
-2*(V dot N)*N + V
其中 V 是速度矢量,N 是球弹跳表面的法线
这是我的脚本:
using UnityEngine;
using System.Collections;
public class BallPhysics : MonoBehaviour {
void Start () {
rigidbody2D.velocity =new Vector2 (-1,-3);
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter2D(Collider2D col) {
if (col.gameObject.name == "Pong") {
tBounce ();
}
}
void tBounce(){
RaycastHit2D hit = Physics2D.Raycast (new Vector2 (transform.position.x,transform.position.y), new Vector2(-1f,-1f));
Vector2 n = hit.normal;
Vector2 v = rigidbody2D.velocity;
Vector2 R = -2 * (Vector2.Dot (v, n)) * n + v;
rigidbody2D.velocity = R;
}
}
我在启动函数中给球一个速度向量,我使用 OnTriggerEnter2D 进行碰撞处理,使用 raycast2D 获取表面的法线。
问题是脚本没有反映称为 R 的速度矢量,我认为问题出在法线矢量上。
例如,假设 V 是 Vector2(-1,-1),那么基本上 R 应该是 (-1,1),但事实并非如此。 R 是 (3,1) !
我已经成功地通过反转球速度使球在 Horizontal/vertical 表面弹跳,但这在任意角度下都无法正常工作,这就是我使用此公式的原因。
那么问题是什么?
您的光线投射可能击中了错误的对撞机。您从 transform.position
开始。那就是你的球对象的中心点。
想象一下从圆心射出的光线。它命中的第一行是什么?它首先击中圆圈本身。所以你的 Raycast 报告球的表面法线,而不是乒乓球拍。
有很多方法可以解决这个问题。您可以应用忽略光线投射的 Physics Layer。我认为有一个这样的预定义。您也可以创建自定义图层并为您的光线投射提供图层蒙版。
还有其他方法可以解决它,比如从其他地方发出光线投射,但由于您是在对象碰撞时这样做,图层蒙版可能是最简单的方法。
我是 unity 的新手,我正在尝试创建一个弹跳球,所以我对弹跳相关物理做了很多研究,我找到了一个公式:
公式:
-2*(V dot N)*N + V
其中 V 是速度矢量,N 是球弹跳表面的法线
这是我的脚本:
using UnityEngine;
using System.Collections;
public class BallPhysics : MonoBehaviour {
void Start () {
rigidbody2D.velocity =new Vector2 (-1,-3);
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter2D(Collider2D col) {
if (col.gameObject.name == "Pong") {
tBounce ();
}
}
void tBounce(){
RaycastHit2D hit = Physics2D.Raycast (new Vector2 (transform.position.x,transform.position.y), new Vector2(-1f,-1f));
Vector2 n = hit.normal;
Vector2 v = rigidbody2D.velocity;
Vector2 R = -2 * (Vector2.Dot (v, n)) * n + v;
rigidbody2D.velocity = R;
}
}
我在启动函数中给球一个速度向量,我使用 OnTriggerEnter2D 进行碰撞处理,使用 raycast2D 获取表面的法线。
问题是脚本没有反映称为 R 的速度矢量,我认为问题出在法线矢量上。
例如,假设 V 是 Vector2(-1,-1),那么基本上 R 应该是 (-1,1),但事实并非如此。 R 是 (3,1) !
我已经成功地通过反转球速度使球在 Horizontal/vertical 表面弹跳,但这在任意角度下都无法正常工作,这就是我使用此公式的原因。 那么问题是什么?
您的光线投射可能击中了错误的对撞机。您从 transform.position
开始。那就是你的球对象的中心点。
想象一下从圆心射出的光线。它命中的第一行是什么?它首先击中圆圈本身。所以你的 Raycast 报告球的表面法线,而不是乒乓球拍。
有很多方法可以解决这个问题。您可以应用忽略光线投射的 Physics Layer。我认为有一个这样的预定义。您也可以创建自定义图层并为您的光线投射提供图层蒙版。
还有其他方法可以解决它,比如从其他地方发出光线投射,但由于您是在对象碰撞时这样做,图层蒙版可能是最简单的方法。