我是团结的新手,我正在努力创造一个弹跳球,所以我做了很多关于弹跳物理学的研究,我发现了一个公式:
公式:
-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)!
我已经成功地通过扭转球速使球在水平/垂直表面上弹跳但是这不能正确地处理任意角度,这就是我使用这个公式的原因。 那么问题是什么?
答案 0 :(得分:1)
你的光线投射可能会碰到错误的对手。你可以在transform.position
开始。这是你的球对象的中心点。
想象一条光线从圆圈的中心出来。它击中的第一线是什么?它首先击中了圆圈。所以你的Raycast会报告球的表面法线,而不是乒乓球拍。
有很多方法可以解决这个问题。您可以应用忽略光线投射的Physics Layer。我认为有一个这样的预定义。您也可以创建自定义元素,并为光线投射提供图层蒙版。
还有其他方法可以解决这个问题,例如从其他地方发起光线投射,但由于你在对象发生碰撞时这样做,因此图层蒙版可能是最简单的。