全景相机 PerspectiveCamCtrl

using UnityEngine;
using System.Collections;
public class PerspectiveCamCtrl : MonoBehaviour {
 public double height = 10.0;
 public double speed = 100.0;
    float yRotSpeed = 30f;
    public float mouseSensivity = 120;
 private Vector3 mousePrevPos;
    //FreeCam variables
    public float camMoveSpeed = 700f;
    public float camXRot = 19;
    public float camYRot = 90;
    public float camZRot = 0;
    public Vector3 camFreeModePos;
    float FildOfViewSpeed = 100; //视角拉近速度
    public void SetCamPosition(Vector3 position)
    {
        camFreeModePos = position;
    }
    private static PerspectiveCamCtrl mSingleton;
    public static PerspectiveCamCtrl Singleton
    {
        get
        {
            return mSingleton;
        }
    }
    void Awake()
    {
        if (mSingleton == null) mSingleton = this;
        else Debug.LogError("Cannot create instance of topCamCtrl more than once");
    }
 void Start () {
        camera.cullingMask = ~(1 << 9);
 }
 
 void Update () {
        FreeCam();
 }
    public void FreeCam()
    {
        Vector3 camPos = camera.transform.position;
        Vector3 camMoveDir = new Vector3();
        Vector3 camDesiredRot = Vector3.zero;
        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
        {
            camMoveDir = camera.transform.forward;
        }
        if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
        {
            camMoveDir = -camera.transform.forward;
        }
        if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
        {
            camMoveDir = Vector3.Cross(camera.transform.forward, camera.transform.up);
        }
        if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
        {
            camMoveDir = -Vector3.Cross(camera.transform.forward, camera.transform.up);
        }
        if (Input.GetKey(KeyCode.Q))
        {
            camYRot -= Time.deltaTime * yRotSpeed;
        }
        if (Input.GetKey(KeyCode.E))
        {
            camYRot += Time.deltaTime * yRotSpeed;
        }
        if (mouseCursorInFrame())
        {
            if (Input.GetMouseButton(1))
            {
                camYRot -= Input.GetAxis("Mouse X") * (Time.deltaTime * mouseSensivity);
                camYRot = ClampAngle(camYRot, -360, 360);
                camXRot += Input.GetAxis("Mouse Y") * (Time.deltaTime * mouseSensivity);
                camXRot = ClampAngle(camXRot, -85, 85);
            }
            if (Input.GetAxis("Mouse ScrollWheel") > 0)
            {
                //Debug.Log("dddd");
                camMoveDir = camera.transform.forward;
                this.camera.fieldOfView -= Time.deltaTime * FildOfViewSpeed;//视角拉近
            }
            if (Input.GetAxis("Mouse ScrollWheel") < 0)
            {
                camMoveDir = -camera.transform.forward;
                //Debug.Log("aaaaa");
                this.camera.fieldOfView += Time.deltaTime * FildOfViewSpeed;//视角拉远
            }
        }
       
        camDesiredRot = new Vector3(camXRot, camYRot, camZRot);
        camMoveDir.Normalize();
        camMoveDir *= (camMoveSpeed * Time.deltaTime);
        camFreeModePos += camMoveDir;
        if (Terrain.activeTerrain != null)
        {
            float desiredTerrainFreeModeY = Terrain.activeTerrain.SampleHeight(camFreeModePos);
            float camFreeModePosY = Mathf.Clamp(camFreeModePos.y, desiredTerrainFreeModeY + 1f, desiredTerrainFreeModeY + 100f);
            camFreeModePos = new Vector3(camFreeModePos.x, camFreeModePosY, camFreeModePos.z);
            //Limit the elevation
        }
        Vector3 finalPosition = Vector3.Lerp(camPos, camFreeModePos, Time.deltaTime + 0.1f);
        if (Terrain.activeTerrain != null)
        {
            float finalDesiredY = Terrain.activeTerrain.SampleHeight(finalPosition);
            if (finalPosition.y < finalDesiredY)
            {
                finalPosition.y = finalDesiredY;
            }
        }
        camera.transform.position = finalPosition;
        //Vector3 currentCamera = camera.transform.rotation.eulerAngles;
        camera.transform.rotation = Quaternion.Slerp(camera.transform.rotation, Quaternion.Euler(camDesiredRot), Time.deltaTime + 0.05f);
    }
 private bool mouseCursorInFrame() {
  Vector3 cursorPos = Input.mousePosition;
  float xMinCoord = Screen.width * camera.rect.xMin;
  float yMinCoord = Screen.height * camera.rect.yMin;
  float xMaxCoord = Screen.width * camera.rect.xMax;
  float yMaxCoord = Screen.height * camera.rect.yMax;
  if(cursorPos.x > xMinCoord && cursorPos.x < xMaxCoord &&
     cursorPos.y > yMinCoord && cursorPos.y < yMaxCoord)
   return true;
  else
   return false;
 }
    private static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
    public void FullScreen()
    {
        camera.enabled = true;
        camera.rect = new Rect(0, 0, 1, 1);
    }
    public void Split()
    {
        camera.enabled = true;
        camera.rect = new Rect(0.5f, 0, 0.5f, 1);
    }
    public void Hide()
    {
        camera.enabled = false;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值