📅  最后修改于: 2023-12-03 15:38:08.831000             🧑  作者: Mango
在很多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);
}
}
通过鼠标滚轮来控制相机的移动和旋转,可以极大地简化对键盘的操作。相比之下,鼠标的操作更加自然,易于掌握。