您的位置:首页 > 移动开发 > Unity3D

unity 摄像机围绕物体转动(有万向锁)

2018-03-10 14:35 309 查看
    public Transform target;//旋转目标

    public float distance = 1.8f;//摄像机和目标之间的距离

    private float speedX = 240f;//x轴转速
    private float speedY = 120f;//y轴转速

    private float mX = 0.0f;//摄像机的旋转角度x
    private float mY = 0.0f;//摄像机的旋转角度y

    private float maxDistance = 5f; //摄像机最远
    private float minDistance = 1.2f;//摄像机最近

    private float zoomSpeed = 0.2f;//摄像机的前进速度(放大)

    public bool isNeedDamping = true;//是否平滑过渡  

    public float damping = 1f;//平滑过渡速度

    // Use this for initialization
    void Start()
    {

        //开始的时候获得角度
        mX = transform.eulerAngles.x;
        mY = transform.eulerAngles.y;
    }

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

        if (target != null && Input.GetMouseButton(0))
        {
            //获得鼠标右键拖拽
            mX += Input.GetAxis("Mouse X") * speedX * Time.deltaTime;
            mY -= Input.GetAxis("Mouse Y") * speedY * Time.deltaTime;
        }

        //鼠标滚轮摄像机的距离
        distance -= Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
        //摄像机的距离范围--限制
        distance = Mathf.Clamp(distance, minDistance, maxDistance);

        //射线机的旋转(有万向锁问题)
         Quaternion mRotation = Quaternion.Euler(mY, mX, 0);
         Vector3 mPosition = mRotation * new Vector3(0, 0, -distance) + target.position;
        

        ////是否平滑过渡  
        //if (isNeedDamping)
        //{
        //    //在from和to之间旋转-插值法
        //    transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * damping);
        //    transform.position = Vector3.Lerp(transform.position, mPosition, Time.deltaTime * damping);
        //}
        //else
        //{
        //    transform.rotation = mRotation;
        //    transform.position = mPosition;
        //}

        //不平滑移动
        transform.rotation = mRotation;
        transform.position = mPosition;

    }

    //限制角度
    private float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360) angle += 360;
        if (angle > 360) angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: