【问题标题】:2D bouncing formula doesn't work properly2D 弹跳公式无法正常工作
【发布时间】:2015-01-16 16:59:30
【问题描述】:

我是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) !

我已经成功地通过反转球的速度使球在水平/垂直表面上弹跳,但这不适用于任意角度,这就是我使用这个公式的原因。 那么有什么问题呢?

【问题讨论】:

  • 为什么不使用物理材质并将反弹设置为 1?
  • 我没有使用这种方法,因为球会在一个位置反弹,我不希望它太逼真。
  • 那很酷,我只是想知道我看了这个问题并且对它感兴趣,我不知道该告诉你什么,我只是说我会使用物理材料,祝你好运: )
  • 您的光线投射是否击中了正确的表面,hit.normal 是否报告了正确的矢量?您的 Raycast 将无限远,因此可以想象它会撞击到您不打算的其他对撞机并报告 表面法线。检查hit.collider.gameObject.name 以确保它是正确的对象。
  • 它显示“ball”,但我不明白为什么它不显示“Pong”?

标签: unity3d game-physics bounce raycasting unity3d-2dtools


【解决方案1】:

您的光线投射可能击中了错误的对撞机。你从transform.position开始。那是你的球对象的中心点。

想象一条射线从圆心射出。它击中的第一行是什么?它首先击中圆圈本身。因此,您的 Raycast 报告的是球的表面法线,而不是乒乓球拍。

有很多方法可以解决这个问题。您可以应用忽略光线投射的Physics Layer。我认为有一个这样的预定义。您也可以创建自定义图层并为您的光线投射提供图层蒙版。

还有其他方法可以解决它,例如从其他地方发起光线投射,但由于您是在对象碰撞时执行此操作,因此图层蒙版可能是最简单的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    相关资源
    最近更新 更多