【问题标题】:Spin physics issue in Unity3dUnity3d中的旋转物理问题
【发布时间】:2015-01-02 19:23:42
【问题描述】:

我正在 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.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;
            }

        }

    }
}

提前谢谢

【问题讨论】:

  • 目前还不清楚问题出在哪里(“奇怪”可能意味着任何事情),恐怕仅用文字来描述可能很难甚至不可能。如果你能制作一个可能会有所帮助的视频。

标签: unity3d


【解决方案1】:

我终于找到了解决方案。实际上,我在加力后使用了扭矩,因此它不会按照旋转方向正确。但这应该类似于先添加扭矩,然后在位置添加力。

这里是示例代码。我希望这将有助于其他人了解 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;
            }

        }

    }
}

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多