相机

相机的数据目标
  1. ViewMatrix:相机的旋转状态描述和位置状态描述。相机的本地坐标系可以使用right(x),up,-front(-z)表示
    1. 相机在世界坐标系中的位置
    2. 相机看向世界坐标系中的点
    3. 穹顶向量
  2. ProjectionMatrix:相机的投影参数描述。对于投影矩阵分为两种,正交投影矩阵和透视投影矩阵
    1. 正交投影矩阵
      1. left
      2. right
      3. bottom
      4. top
      5. near
      6. far
    2. 透视投影矩阵
      1. foy
      2. aspect
      3. near
      4. far
相机旋转方式
  1. pitch:以x轴作为旋转轴,效果就是相机向上或者向下看
  2. yaw:以y轴作为旋转轴,效果就是相机向左或者向右看
  3. roll:以z轴作为旋转轴,效果就是相机绕自身视线旋转
    image
相机分类

两种相机:游戏相机,轨迹球相机

  1. 轨迹球相机:相机锁定在一个球面上运动,上下沿着经线运动,左右沿着纬度运动,半径固定
    1. yaw的旋转轴是y轴,经过一定角度旋转后,right,up向量会更改,位置也更改
    2. pitch的旋转轴是x轴,经过一定角度旋转后,right向量会更改,位置也更改
  2. 游戏相机:即使转动一定角度,相机位置不变

摄像机控制系统

相机控制系统根据鼠标或者键盘的输入,计算所辖相机的position,up,right向量的最新值

键盘的鼠标响应事件
  1. 鼠标左键按下(右键,中键)
  2. 鼠标左键抬起(右键,中键)
  3. 鼠标移动
  4. 键盘按下:比如WASD四个按键控制上下左右
  5. 键盘抬起:比如WASD四个按键控制上下左右
摄像机控制系统的设计

由于当前系统涉及到游戏相机控制器和轨迹球相机控制器两种,因此应该将两者公共的属性和行为放到他们的基类当中。

  1. 公共属性和行为:
    1. 属性
      1. 记录鼠标左中右键是否按下
      2. 如果鼠标点击事件发生,记录点击的位置
      3. 记录哪个按键被按下
      4. 敏感度:旋转的角度需要和鼠标横纵移动的偏移量关联,比如说鼠标向y轴正方向移动了3个像素,那么对应旋转变化的角度pitch是多少。
      5. 控制的相机:比如正交投影相机或者透视投影相机
    2. 行为:
      1. 接受外部鼠标移动事件
      2. 接受外部鼠标按下/抬起事件
      3. 接受外部键盘按下,抬起事件
      4. 更新函数:每一帧都需要更新
  2. 不同的属性和行为:
    1. 对于轨迹球相机控制器:
      1. 当上下沿着经线运动时,会绕着x轴(在相机类的描述中即为right向量)转动一个pitch角度,此时需要更新相机的position,up向量
      2. 当上下沿着纬线运动时,会绕着y轴转动一个yaw角度,此时需要更新相机的position,right,up向量都会更改
      3. 使用鼠标中键进行滚轮缩放:使用正交投影相机时,本质是变化了投影盒子的缩放大小;使用透视投影相机时,本质是沿着front向量运动摄像机
    2. 对于游戏相机控制器:
      1. 使用鼠标右键进行控制摄像机镜头旋转:
        1. pitch角在[-90,90]之间
        2. pitch与yaw旋转不会影响相机的位置
      2. 使用WASD控制移动:需要每一帧检测WASD是否被按下。如果处于按下的状态,应该更新相机的位置

实现

https://gitee.com/excelcoder/graphic/blob/master/primary/28_camera_system