相机
相机的数据目标
- ViewMatrix:相机的旋转状态描述和位置状态描述。相机的本地坐标系可以使用right(x),up,-front(-z)表示
- 相机在世界坐标系中的位置
- 相机看向世界坐标系中的点
- 穹顶向量
- ProjectionMatrix:相机的投影参数描述。对于投影矩阵分为两种,正交投影矩阵和透视投影矩阵
- 正交投影矩阵
- left
- right
- bottom
- top
- near
- far
- 透视投影矩阵
- foy
- aspect
- near
- far
- 正交投影矩阵
相机旋转方式
- pitch:以x轴作为旋转轴,效果就是相机向上或者向下看
- yaw:以y轴作为旋转轴,效果就是相机向左或者向右看
- roll:以z轴作为旋转轴,效果就是相机绕自身视线旋转
![image]()
相机分类
两种相机:游戏相机,轨迹球相机
- 轨迹球相机:相机锁定在一个球面上运动,上下沿着经线运动,左右沿着纬度运动,半径固定
- yaw的旋转轴是y轴,经过一定角度旋转后,right,up向量会更改,位置也更改
- pitch的旋转轴是x轴,经过一定角度旋转后,right向量会更改,位置也更改
- 游戏相机:即使转动一定角度,相机位置不变
摄像机控制系统
相机控制系统根据鼠标或者键盘的输入,计算所辖相机的position,up,right向量的最新值
键盘的鼠标响应事件
- 鼠标左键按下(右键,中键)
- 鼠标左键抬起(右键,中键)
- 鼠标移动
- 键盘按下:比如WASD四个按键控制上下左右
- 键盘抬起:比如WASD四个按键控制上下左右
摄像机控制系统的设计
由于当前系统涉及到游戏相机控制器和轨迹球相机控制器两种,因此应该将两者公共的属性和行为放到他们的基类当中。
- 公共属性和行为:
- 属性
- 记录鼠标左中右键是否按下
- 如果鼠标点击事件发生,记录点击的位置
- 记录哪个按键被按下
- 敏感度:旋转的角度需要和鼠标横纵移动的偏移量关联,比如说鼠标向y轴正方向移动了3个像素,那么对应旋转变化的角度pitch是多少。
- 控制的相机:比如正交投影相机或者透视投影相机
- 行为:
- 接受外部鼠标移动事件
- 接受外部鼠标按下/抬起事件
- 接受外部键盘按下,抬起事件
- 更新函数:每一帧都需要更新
- 属性
- 不同的属性和行为:
- 对于轨迹球相机控制器:
- 当上下沿着经线运动时,会绕着x轴(在相机类的描述中即为right向量)转动一个pitch角度,此时需要更新相机的position,up向量
- 当上下沿着纬线运动时,会绕着y轴转动一个yaw角度,此时需要更新相机的position,right,up向量都会更改
- 使用鼠标中键进行滚轮缩放:使用正交投影相机时,本质是变化了投影盒子的缩放大小;使用透视投影相机时,本质是沿着front向量运动摄像机
- 对于游戏相机控制器:
- 使用鼠标右键进行控制摄像机镜头旋转:
- pitch角在[-90,90]之间
- pitch与yaw旋转不会影响相机的位置
- 使用WASD控制移动:需要每一帧检测WASD是否被按下。如果处于按下的状态,应该更新相机的位置
- 使用鼠标右键进行控制摄像机镜头旋转:
- 对于轨迹球相机控制器:
实现
https://gitee.com/excelcoder/graphic/blob/master/primary/28_camera_system

浙公网安备 33010602011771号