📜  如何使用鼠标滚轮统一移动相机 - C#(1)

📅  最后修改于: 2023-12-03 15:38:08.831000             🧑  作者: Mango

如何使用鼠标滚轮统一移动相机 - C#

在很多3D图形开发中,经常需要拥有统一移动相机的功能,因为同时按下多个方向键进行移动既不方便也易出错。鼠标滚轮统一移动相机是一个不错的解决方案,下面就介绍如何使用C#实现这个功能。

准备工作

首先需要使用C#创建一个摄像机类(Camera),这个类需要拥有如下属性:

public class Camera
{
    // 摄像机的位置
    public Vector3 Position { get; set; }
    // 摄像机的方向
    public Vector3 Forward { get; set; }
    // 摄像机的上方向
    public Vector3 Up { get; set; }
    // 摄像机的右方向
    public Vector3 Right { get; set; }
    // 摄像机的移动速度
    public float MoveSpeed { get; set; }
    // 摄像机的旋转速度
    public float RotateSpeed { get; set; }
}

我们使用Vector3来表示摄像机的位置,方向以及上方向和右方向。MoveSpeed表示摄像机的移动速度,RotateSpeed表示摄像机的旋转速度。

移动相机

鼠标滚轮可以控制相机的移动方向,具体操作如下:

public void MoveCamera(Vector2 delta)
{
    var moveDirection = Forward * delta.y + Right * delta.x;

    Position += moveDirection * MoveSpeed;
}

通过计算出滑动的距离和相机的前方和右方向量相乘,就可以得到移动方向。移动时,只需要将计算出来的方向向量乘以摄像机的移动速度,再加上摄像机的位置即可。

旋转相机

除了移动相机,鼠标滚轮也可以控制相机的旋转方向,具体操作如下:

public void RotateCamera(Vector2 delta)
{
    var eulerAngle = new Vector3(delta.y, delta.x, 0.0f) * RotateSpeed;

    // 将角度转化为四元数
    var rotateQuaternion = Quaternion.Euler(eulerAngle);

    // 旋转相机的前方向量和上方向量
    Forward = rotateQuaternion * Forward;
    Up = rotateQuaternion * Up;

    // 计算右方向量
    Right = Vector3.Cross(Forward, Up);
}

根据鼠标移动的距离,计算出欧拉角,并将其转化为四元数。然后,通过四元数将相机的前方向量和上方向量旋转即可。最后,计算出相机的右方向量。

完整代码
using UnityEngine;

public class Camera : MonoBehaviour
{
    /// <summary>
    /// 相机的位置
    /// </summary>
    public Vector3 Position { get; set; }

    /// <summary>
    /// 相机的方向
    /// </summary>
    public Vector3 Forward { get; set; }

    /// <summary>
    /// 相机的上方向
    /// </summary>
    public Vector3 Up { get; set; }

    /// <summary>
    /// 相机的右方向
    /// </summary>
    public Vector3 Right { get; set; }

    /// <summary>
    /// 相机的移动速度
    /// </summary>
    public float MoveSpeed { get; set; }

    /// <summary>
    /// 相机的旋转速度
    /// </summary>
    public float RotateSpeed { get; set; }

    void Start()
    {
        Position = transform.position;
        Forward = transform.forward;
        Up = transform.up;
        Right = transform.right;
    }

    void Update()
    {
        var delta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));

        MoveCamera(delta);
        RotateCamera(delta);
    }

    /// <summary>
    /// 移动相机
    /// </summary>
    /// <param name="delta">鼠标滑动距离</param>
    public void MoveCamera(Vector2 delta)
    {
        var moveDirection = Forward * delta.y + Right * delta.x;

        Position += moveDirection * MoveSpeed;

        transform.position = Position;
    }

    /// <summary>
    /// 旋转相机
    /// </summary>
    /// <param name="delta">鼠标滑动距离</param>
    public void RotateCamera(Vector2 delta)
    {
        var eulerAngle = new Vector3(delta.y, delta.x, 0.0f) * RotateSpeed;

        // 将角度转化为四元数
        var rotateQuaternion = Quaternion.Euler(eulerAngle);

        // 旋转相机的前方向量和上方向量
        Forward = rotateQuaternion * Forward;
        Up = rotateQuaternion * Up;

        // 计算右方向量
        Right = Vector3.Cross(Forward, Up);

        transform.rotation = Quaternion.LookRotation(Forward, Up);
    }
}
总结

通过鼠标滚轮来控制相机的移动和旋转,可以极大地简化对键盘的操作。相比之下,鼠标的操作更加自然,易于掌握。