Unity3d实现鼠标控制相机绕物体旋转(带阻尼)

Unity3d实现鼠标控制相机绕物体旋转(带阻尼)

本来想的是用四元数实现球性插值实现阻尼效果,但是不知道四元数怎么绕定点旋转。因此用速度衰减的方法进行实现。
1.实现鼠标控制相机带阻尼旋转
2.实现鼠标中键放大鼠标所在位置的


using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class rotate1 : MonoBehaviour

{

    public Transform CenObj;//围绕的物体
    public float ratio = 1.0f;//放大缩小速率
    public float min_distance = 5.0f; //相机距物体最小距离
    public float max_distance = 10.0f;//相机距物体最大距离

    //滑动结束时的瞬时速度
    Vector3 Speed = Vector3.zero;
    //每帧偏差
    Vector3 offSet = Vector3.zero;

    //速率衰减值
    public float decelerationRate = 0.2f;

    private Vector3 Rotion_Transform;
 
    private new Camera camera;

    void Start()

    {
        camera = GetComponent<Camera>();

        Rotion_Transform = CenObj.position;
    }

    void Update()

    {

        Ctrl_Cam_Move();

        Cam_Ctrl_Rotation();

    }

    //镜头的远离和接近

    public void Ctrl_Cam_Move()

    {
        Vector3 mousePos = camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.1f));
        if (Input.GetAxis("Mouse ScrollWheel") > 0 && Vector3.Distance(CenObj.position,camera.transform.position)>min_distance) //放大

        {

            camera.transform.position -= ratio * (camera.transform.position - mousePos);

        }

        if (Input.GetAxis("Mouse ScrollWheel") < 0 && Vector3.Distance(CenObj.position,camera.transform.position)<max_distance) //缩小

        {

            camera.transform.position += ratio * (camera.transform.position - mousePos);

        }

    }

    //摄像机的旋转

    public void Cam_Ctrl_Rotation()

    {

        var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动

        var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动

        if(Input.GetMouseButton(0))
        {
            offSet.x = mouse_x;
            offSet.y = mouse_y;
            //瞬时速度
            Speed = offSet / Time.deltaTime;
        }
        else
        {
            Speed *= Mathf.Pow(decelerationRate, Time.deltaTime);
            if (Mathf.Abs(Vector3.Magnitude(Speed)) < 1)
            {
                Speed = Vector3.zero;
            }

        }
        Move(Speed);

    }
    public void Move(Vector3 speed)
    {
        if(Vector3.Magnitude(speed)==0)
        {
            return;
        }
        Debug.Log("Move");
        transform.RotateAround(Rotion_Transform, Vector3.up, speed.x*Time.deltaTime*2.0f);

        transform.RotateAround(Rotion_Transform, transform.right, speed.y*Time.deltaTime*2.0f);

    }

}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值