J Gogoi
J Gogoi

Reputation: 169

Spin physics issue in Unity3d

I am working on a Snooker Game project in Unity3D. I have achieved the feels of snooker physics. But while taking the spin shoots it is doing some wired activity. I have added torque after adding force in certain direction. Can any one please suggest me what exactly I have missed.

Here is my code

using UnityEngine;
using System.Collections;

public class CueBall : MonoBehaviour {

    private enum SPIN{ nospin, leftspin,rightspin,topspin,bottomspin};

    private SPIN currentSpin = SPIN.topspin;

    private float cueStrength = 1000.0f;
    public Transform cueStick;

    // Use this for initialization
    void Start () {

        rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;

    }

    // Update is called once per frame
    void FixedUpdate () {


        if(Input.GetMouseButtonDown(0)){

                gameObject.rigidbody.drag = 0.6f;
                gameObject.rigidbody.mass = 1.2f;
                gameObject.rigidbody.angularDrag = 1.5f; 

            switch(currentSpin){


                case SPIN.topspin :

                    rigidbody.AddForceAtPosition(cueStick.forward * cueStrength,transform.position,ForceMode.Acceleration);
                rigidbody.AddTorque(Vector3.back * cueStrength );

                    break;

                case SPIN.bottomspin:

                        rigidbody.AddForceAtPosition(cueStick.forward * cueStrength,transform.position,ForceMode.Acceleration);
               rigidbody.AddTorque(Vector3.forward * cueStrength );

                    break;
            }

        }

    }
}

Thank you advance

Upvotes: 0

Views: 1537

Answers (1)

J Gogoi
J Gogoi

Reputation: 169

Finally I got the solution. Actually I have used the torque after adding force so it is not going at right direction as per spin. But it should be like Add Torque First and then Add Force at Position.

Here is the sample code. I hope this will help little bit other people regarding spin physics in unity3d.

using UnityEngine;
using System.Collections;

public class CueBall : MonoBehaviour {

    private enum SPIN{ nospin, leftspin,rightspin,topspin,bottomspin};

    private SPIN currentSpin = SPIN.topspin;

    private float cueStrength = 1000.0f;
    public Transform cueStick;

    // Use this for initialization
    void Start () {

        rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;

    }

    // Update is called once per frame
    void FixedUpdate () {


        if(Input.GetMouseButtonDown(0)){

                gameObject.rigidbody.drag = 0.6f;
                gameObject.rigidbody.mass = 1.2f;
                gameObject.rigidbody.angularDrag = 1.5f; 

            switch(currentSpin){

            case SPIN.topspin :

                    rigidbody.AddTorque(Vector3.back * cueStrength );
                    rigidbody.AddForceAtPosition(cueStick.forward * cueStrength,transform.position,ForceMode.Acceleration);

                    break;

            case SPIN.bottomspin:

                    rigidbody.AddTorque(Vector3.forward * cueStrength );
                    rigidbody.AddForceAtPosition(cueStick.forward * cueStrength,transform.position,ForceMode.Acceleration);

                    break;
            case SPIN.leftspin:

                    rigidbody.AddTorque(Vector3.up * cueStrength);
                    rigidbody.AddForceAtPosition(cueStick.forward * cueStrength,transform.position,ForceMode.Acceleration);

                break;
            case SPIN.rightspin:

                    rigidbody.AddTorque(Vector3.down * cueStrength );
                    rigidbody.AddForceAtPosition(cueStick.forward * cueStrength,transform.position,ForceMode.Acceleration);

                break;
            default : // no spin
                    // no required torque
                    rigidbody.AddForceAtPosition(cueStick.forward * cueStrength,transform.position,ForceMode.Acceleration);
                break;
            }

        }

    }
}

Thank You

Upvotes: 2

Related Questions