操作物体任意方向旋转的三种方法

来源:互联网 发布:淘游戏号软件 编辑:程序博客网 时间:2024/06/02 07:29

方法一:

private Transform hitTransfrom;          void Update(){    if (Input.GetMouseButtonDown(0))    {        RaycastHit hit;        Ray mouseray = Camera.main.ScreenPointToRay(Input.mousePosition);        if (Physics.Raycast(mouseray, out hit))        {            hitTransfrom = hit.transform;        }    }    else if (Input.GetMouseButtonUp(0))    {        hitTransfrom = null;    }    if (hitTransfrom)    {        Matrix4x4 localmatrix = hitTransfrom.worldToLocalMatrix;        Vector3 vUp = localmatrix.MultiplyVector(new Vector3(0, 1, 0));        Vector3 vRight = -localmatrix.MultiplyVector(new Vector3(1, 0, 0));        float fMoveX = -Input.GetAxis("Mouse X") * Time.deltaTime * 200.0f;        Quaternion rotation = Quaternion.AngleAxis(fMoveX, vUp);        hitTransfrom.localRotation *= rotation;        float fMoveY = -Input.GetAxis("Mouse Y") * Time.deltaTime * 200.0f;        Quaternion rotoy = Quaternion.AngleAxis(fMoveY, vRight);        hitTransfrom.localRotation *= rotoy;    }}

方法二:

using UnityEngine;using System.Collections;        public class DragRotate : MonoBehaviour{    void OnMouseDrag ()    {        this.transform.Rotate(new Vector3(Input.GetAxis("Mouse Y"),-Input.GetAxis("Mouse X"),0)*6f,Space.World);    }        }

方法三:

using UnityEngine;using System.Collections;    public class DragRotate : MonoBehaviour{    private bool onDrag = false;    public float speed = 6f;    private float tempSpeed;    private float axisX;    private float axisY;    void OnMouseDrag ()    {        onDrag = true;        axisX=-Input.GetAxis ("Mouse X");        axisY=Input.GetAxis ("Mouse Y");    }            float Rigid ()    {        if (onDrag) {            if (tempSpeed < speed) {                tempSpeed += speed * Time.deltaTime*5;            }else{                tempSpeed=speed;            }        } else {            if(tempSpeed>0){                tempSpeed-=speed * Time.deltaTime;            }else{                tempSpeed = 0;            }        }        return tempSpeed;    }            void Update ()    {        this.transform.Rotate (new Vector3 (axisY, axisX, 0) * Rigid (), Space.World);        if (!Input.GetMouseButton (0)) {            onDrag = false;        }    }}

另外加入了缩放的代码,缩放、自动旋转、拖拽物体的综合:

using UnityEngine;using System.Collections;  public class ZoomAndDrag : MonoBehaviour {      public Camera MainCamera;    public float ZoomMin;      //滚轮的最小值    public  float ZoomMax;      //滚轮的最大值    private float normalDistance;   //设置摄像机的景深值    private float MouseWheelSencitivity = 10.0f;    //鼠标灵敏度,就是缩放的速度的快慢     private float axisX;    private float axisY;    public float speed = 6f;    private float tempSpeed;     private bool RoationOnly;     void Start ()     {        normalDistance = 50.0f;        ZoomMin = 20.0f;        ZoomMax = 100.0f;        RoationOnly = true;    }              void Update ()     {        Roation();        Zoom();        this.transform.Rotate(new Vector3(axisY, axisX, 0) * Rigid(), Space.World);     //物体旋转的方法    }      //自动旋转物体的方法,放在Update中调用    void Roation()    {        if (RoationOnly)        {            gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 10);        }    }     /****    *鼠标滚轮缩放物体的方法     *      * **/    void Zoom()    {        if (Input.GetAxis("Mouse ScrollWheel") != 0)        {            if (normalDistance >= ZoomMin && normalDistance <= ZoomMax)            {                normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSencitivity;            }            if (normalDistance < ZoomMin)            {                normalDistance = ZoomMin;            }            if (normalDistance > ZoomMax)            {                normalDistance = ZoomMax;            }             MainCamera.fieldOfView = normalDistance;        }    }  /***   *    * 鼠标左键控制物体360°旋转+惯性   * **/    float Rigid()    {        if (Input.GetMouseButton(0))        {            RoationOnly = false;    //当鼠标按下的时候,停止自动旋转             axisX = Input.GetAxis("Mouse X");            axisY = Input.GetAxis("Mouse Y");            if (tempSpeed < speed)            {                tempSpeed += speed * Time.deltaTime * 5;            }            else            {                tempSpeed = speed;            }        }        else        {            RoationOnly = true;     //当鼠标没有按下的时候,恢复自动旋转            if (tempSpeed > 0)            {                tempSpeed -= speed * Time.deltaTime;            }            else            {                tempSpeed = 0;            }        }        return tempSpeed;    }}


原创粉丝点击