Unity 3D鼠標操作實現旋轉(相機圍繞目標物體)、縮放觀察物體


 

//放在攝像頭上,實現旋轉、縮放觀察物體
using UnityEngine;

public class BaseCam : MonoBehaviour
{
  ///縮放距離

  public float ZoomSpeed=30;
  //拖動速度

  public float MovingSpeed=0.5f;
  //視角和擺動速度

  public float RotateSpeed=1;
  //攝像機旋轉速度

  public float distance=30;
  public Transform rotateCenter;
public Vector3 mousePos1; //記錄鼠標點下去瞬間的位置 public Vector3 mousePos2; //記錄鼠標任何時刻的位置 public Quaternion start_qua; //角度使用四元數 public Vector3 start_pos; //位置坐標 // Use this for initialization void Start() { //記錄相機開始的角度與位置 start_qua = transform.rotation; start_pos = transform.position; }   Quaternion rotation;
  Vector3 position;
  float delta_x,delta_y,delta_z;
  float delta_rotation_x,delta_rotation_y;
// Update is called once per frame void Update() {
    //拖動
    if(Input.GetMouseButton(2))
    {
      delta_x=Input.GetAxis("Mouse X")*MovingSpeed;
      delta_y=Input.GetAxis("Mouse Y")*MovingSpeed;
      rotation=Quaternion.Euler(0,transform.rotation.eulerAngles.y,0);
      transform.position=rotation*new Vector3(-delta_x,-delta_y,0)+transform.position;
    }
    //縮放

    if(Input.GetAxis("Mouse ScrollWheel")!=0)
    {
      delta_z=-Input.GetAxis("Mouse ScrollWheel")*ZoomSpeed;

      transform.Translate(0,0,-delta_z);

      //distance+=delta_z;
    }


 //記錄鼠標實時移動的點
        mousePos2 = Input.mousePosition; 


    //旋轉中心為自身(相機)
    if(Input.GetMouseButton(1))
    {
      delta_rotation_x=Input.GetAxis("Mouse X")*RotateSpeed;
      delta_rotation_y=-Input.GetAxis("Mouse Y")*RotateSpeed;
      position=transform.rotation*new Vector3(0,0,distance)+transform.position;
      transform.Rotate(0,delta_rotation_x,0,Space.World);
      transform.Rotate(delta_rotation_y,0,0);
      transform.position=transform.rotation*new Vector3(0,0,-distance)+position;

    }

  }
void OnGUI() { //鼠標左鍵 if (Input.GetMouseButton(0)) { mousePos1 = Input.mousePosition; //記錄鼠標點擊瞬間的點 Vector3 offset = mousePos1 - mousePos2; //記錄鼠標移動的距離 //上下與左右 旋轉分開,絕對值比較 if (Mathf.Abs(offset.x) > Mathf.Abs(offset.y)) { //以物體上方為旋轉軸(Vector3.up == new Vector3(0, 1.0f, 0)),物體左右旋轉角度與鼠標橫向移動距離相關,變化速率2f transform.RotateAround(new Vector3(0, 0, 0), Vector3.up, Time.deltaTime * offset.x * 2f);
         // transform.RotateAround(rotateCenter.localPosition, Vector3.up, Time.deltaTime * offset.x * 2f); //旋轉中心為目標物體rotateCenter
       
            }
            else
            {
                //以世界坐標右方為旋轉軸(transform.right,是會變化的量),物體上下旋轉角度與鼠標縱向移動距離相關,變化速率2f
                transform.RotateAround(new Vector3(0, 0, 0), transform.right, -Time.deltaTime * offset.y * 2f);//旋轉中心為世界
// transform.RotateAround(rotateCenter.localPosition, transform.right, -Time.deltaTime * offset.y * 2f);//旋轉中心為目標物體rotateCenter

}
//打印數據transform.right變量 Debug.Log("pos: " + transform.right); } ////鼠標中鍵,物體恢復原來的角度與位置 // if (Input.GetMouseButton(2)) // { // transform.rotation = start_qua; // transform.position = start_pos; // } ////鼠標中鍵滑動,物體縮放,攝像頭前后移動距離范圍在2f~5f,變化速率3f // if (Input.GetAxis("Mouse ScrollWheel") > 0f && Vector3.Distance(transform.position, new Vector3(0, 0, 0)) > 2f) // { // transform.Translate(Vector3.forward * Time.deltaTime * Input.GetAxis("Mouse ScrollWheel") * 5f);
       // }
       // if (Input.GetAxis("Mouse ScrollWheel") < 0f && Vector3.Distance(transform.position, new Vector3(0, 0, 0)) <5f)
       // {
           // transform.Translate(Vector3.back * Time.deltaTime * (-Input.GetAxis("Mouse ScrollWheel")) * 5f);
        //}//
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM