添加一个Editor camera
- /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
- 原理:接受用户输入(鼠标,按键……),通过(callback / 内置API)获取差值 / 是否触发用户输入,更新唯一view的位置 (view的翻转矩阵),设定唯一的摄像机的projection矩阵,,作为所有物体的 视图投影 矩阵。
- Euler欧拉角和quad四元数基本概念:
- 俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll),分别绕xyz轴旋转
- 万向节死锁:参考视频
- quad避免死锁,xyzw四个参数
- /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
- 目标:按住alt,鼠标左键旋转,中键平移,右键旋转。接受滚轮缩放。WASD根据相机的局部坐标移动。
private://投影矩阵(视野,宽高比,近平面和远平面)float m_FOV = 45.0f, m_AspectRatio = 1.778f, m_NearClip = 0.1f, m_FarClip = 1000.0f;//glm::mat4 m_ViewMatrix;//视图矩阵,glm::mat4 m_ProMatrix;//投影矩阵//glm::vec3 m_Position = { 0.0f, 0.0f, 0.0f };//计算后的新位置(平移的目标点 - 在相机的z方向上的距离)glm::vec3 m_FocalPoint = { 0.0f, 0.0f, 0.0f };//本次目标点//glm::vec2 m_InitialMousePosition = { 0.0f, 0.0f };//鼠标上一次位置//float m_Distance = 10.0f;//距离原点的距离//float m_Pitch = 0.0f, m_Yaw = 0.0f;//仰角和偏航角//float m_ViewportWidth = 1280, m_ViewportHeight = 720;//视口大小
- 实现:
- /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
- 事件:
- 接受用户按键输入,新建input类,目的抽象出用户输入,bool函数((参数 int) GLFW__KEY…… || GLFW__MOUSE……):glfwGetKey(app中的窗口,int 参数)以此判断是否按下了int……键(键盘 || 鼠标)
- glfwGetCursorPos()获取当前鼠标位置
- /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
- 函数:
- 抽象出EditorCamera类,目标:透视摄像机,接受用户输入,改变ViewMatrix
- 构造函数中初始ProMatrix,OnUpdate中if判断是否按下了按键,调用相应函数,计算出新的vec3(摄像机位置),并调用更新ViewMatrix
- /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
- 旋转平移缩放:
- 旋转改变局部旋转成员变量,从而当wasd计算新的vec3向量时,新向量vec3 + = 速度(标量)* 局部的坐标轴(向量)vec3
- 对于滚轮的差值,需要从glfwSetScrollCallback()回调函数获取
void EditorCamera::MouseScrolledEvent(GLFWwindow* window, double xOffset, double yOffset)
-
- /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
- speed优化:
- 速度整体优化:计算时差。
- 对于平移速度,优化:把距离考虑distance 进去。
- 对于缩放距离优化: distance * distance平方函数:距离越大,移动越快,距离越小移动越慢
- 最后需要反转视图矩阵m_ViewMatrix = glm::inverse(m_ViewMatrix);我们摄像机是正常思维去变换的,那么实际传给glsl,改变物体位置,那么需要物体按照相反的方向移动
- /\/\/\/\/\//\/\/\/\/\/\/\/\//\/\///\/\/\/\//\/\/\/\//\//\/\/\/\/\\/
- LookAt()函数,实际上是一个内置矩阵,(不需要反转)
- 参数:相机位置、目标点和上向量
- 作用:计算viewMatrix
- 对于接受用户输入,改变相机当前的vec3位置向量,传入lookat函数