Unity学习日常问题记录七--尝试编写部分自己简单的碰撞规则一

来源:互联网 发布:伏尔加庄园 知乎 编辑:程序博客网 时间:2024/06/10 22:15

有了6中的问题,我们先建立一个脚本,如BallCollider.cs绑定在白球上

然后向脚本里添加void OnCollisionEnter(Collision collision) 

1.添加如gameObject.GetComponent<Rigidbody> ().velocity = new Vector3 (1, 0, 1); 生效

2.当空的时候正常碰撞

这说明OnCollisionEnter看起来发生在Unity实际的碰撞之前又不覆盖其


无损的进出角相同的单点碰撞球体反弹,

y = x - 【2*(x•z/|z|)】z,x和y为inVelocity和outVelocity,z为球心到碰撞点方向单位矢量,忘记的可以查下点积的几何定义

然后,第一次尝试的代码如下

    void OnCollisionEnter(Collision collision) {

        if (collision.collider.tag == "TableSide") {
            ContactPoint[] colliderPoints= collision.contacts;
            if (colliderPoints.Length == 1) {
                Vector3 inVelocity = ballSelfRigidbody.velocity;
                Vector3 verticalAxis = (colliderPoints [0].point - gameObject.transform.position).normalized;
                //y = x - 【2*(x•z/|z|)】z,x和y为inVelocity和outVelocity,z为球心到碰撞点方向单位矢量
                Vector3 outVelocity = inVelocity - 2 * (inVelocity.x*verticalAxis.x + inVelocity.y*verticalAxis.y + inVelocity.z*verticalAxis.z) * verticalAxis;
                ballSelfRigidbody.velocity = outVelocity;
            } else {
                Debug.Log ("colliderPoints.Length 不等于1.");
            }

     }

实际测试,有个时候碰撞正常,像弹力为1时候的样子,有时反弹角度不对,有时速度慢时贴边来回弹几次,贴边不动了或是消失垂直案边的速度,不反弹起来。

为了寻找问题,我们把以白球为原型,做了一白一红两个预设体TestBall和TestBall2,去掉刚体和碰撞体,只要个样子

脚本内容改成

   void OnCollisionEnter(Collision collision) {
        //gameObject.GetComponent<Rigidbody> ().velocity = new Vector3 (1, 0, 1);
        if (collision.collider.tag == "TableSide") {
            ContactPoint[] colliderPoints= collision.contacts;
            Vector3 whiteBallPosition = Vector3.zero;
            if (colliderPoints [0].thisCollider.name == "WhiteBall")
                whiteBallPosition = colliderPoints [0].thisCollider.gameObject.transform.position;
            if (colliderPoints.Length == 1) {
                Vector3 inVelocity = ballSelfRigidbody.velocity;
                Vector3 verticalAxis = (colliderPoints [0].point - gameObject.transform.position).normalized;
                //y = x - 【2*(x•z/|z|)】z,x和y为inVelocity和outVelocity,z为球心到碰撞点方向单位矢量
                Vector3 outVelocity = inVelocity - 2 * (inVelocity.x*verticalAxis.x + inVelocity.y*verticalAxis.y + inVelocity.z*verticalAxis.z) * verticalAxis;
                ballSelfRigidbody.velocity = outVelocity;
                Debug.Log ("colliderPoints [0].point = " + colliderPoints [0].point.ToString("f4") + "----gameObject.transform.position = " + gameObject.transform.position.ToString("f4") + "----whiteBallPosition = " + whiteBallPosition.ToString("f4") + "\n" +
                    "in = " + inVelocity.ToString("f4") + "---out = " + outVelocity.ToString("f4") + "----verticalAxis = " + verticalAxis.ToString("f4"));
                Instantiate (testBall,colliderPoints [0].point,Quaternion.identity);
                Instantiate (testBall2, gameObject.transform.position, Quaternion.identity);
            } else {
                Debug.Log ("colliderPoints.Length 不等于1.");
            }
            //collision.contacts
        }
        
    }



可以看出碰撞点的位置(图中白球)看起来都是正常,而用gameObject.transform.position得到的碰撞时的白球位置有时似乎有问题。而且从collosion中取得的白球位置和gameObject上取得白球位置是一样的,看来碰撞时白球位置不同步发生在给void OnCollisionEnter(Collision collision)的collision参数赋值之前。

0 0
原创粉丝点击