前言:记录OpenGL学习过程中的一些知识点,以个人理解为主。

LookAt函数将顶点的世界空间坐标转换为观察空间坐标,实际上是以相机为原点重新定义的三维空间。

glm::mat4 LookAt(glm::vec3 pos, glm::vec3 target, glm::vec3 up)

函数接受三个参数,相机位置pos,目标位置target以及相机上向量up。工作流程是:glm::vec3 zaxis = normalize(pos-target)指向观察空间正Z轴方向,glm::vec3 xaxis = normalize(glm::cross(up, zaxis))指向观察空间正X轴方向,glm::vec3 = glm::cross(zaxis, xaxis)指向观察空间正Y轴方向。

欧拉角Euler Angle可以表示三维空间中任何旋转的三个值,包括俯仰角Pitch、偏航角Yaw和滚转角Roll。想象在OpenGL右手坐标空间中沿着Z轴开飞机,飞机头抬起或者下降的角度是俯仰角Pitch(绕X轴),飞机头向左或向右摆动是偏航角Yaw(绕Y轴),飞机做战术翻滚是滚转角(绕Z轴)。

欲让场景中的模型移动,相对改变相机的位置即可;旋转的实现比较复杂,需要进行较复杂的数学运算。

当前实验,实现旋转用Trackball比较合适,不过网上一大堆资料都是glut那一套,现在用的glfw,半吊子水平。幸运看到一篇直接针对模型进行旋转(https://blog.csdn.net/qq_40515692/article/details/102902559),改了改挺好使的:

//全局变量
float xrot = 0.0f, yrot = 0.0f;
float xdiff = 0.0f, ydiff = 0.0f;//回调函数
void cursor_position_callback(GLFWwindow*window, double xpos, double ypos)
{if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS){yrot = xpos - xdiff;xrot = ypos + ydiff;}
}void mouse_button_callback(GLFWwindow*window, int button, int action, int mods);
{double xpos, ypos;glfwGetCursorPos(window, &xpos, &ypos);if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS){xdiff = xpos - yrot;ydiff = -ypos + xrot;}
}int main()
{……glm::mat4 tmpmodel=glm::mat4(1.0f);while (!glfwWindowShouldClose(window)){……glm::mat4 model=glm::mat4(1.0f);if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS){model = glm::rotate(model, 0.1f*xrot, glm::vec3(1.0, 0.0, 0.0));model = glm::rotate(model, 0.1f*yrot, glm::vec3(0.0, 1.0, 0.0));tmpmodel=model;}else{model=tmpmodel;        //鼠标释放后,保持模型停在当前状态}……}……return 0;
}

不如Trackball,但好歹转起来了o(* ̄▽ ̄*)ブ

OpenGL LookAt函数理解相关推荐

  1. 第七课,OpenGL之LookAt函数

    观察空间 通过给定摄像机位置,摄像机焦点,摄像机顶部分向量,可得到摄像机的固定位置. glm::lookAt(cameraPos, cameraFocus, cameraUp); LookAt函数提供 ...

  2. 推导LookAt函数定义的视图矩阵

    在OpenGL中需要定义一个视图(view)矩阵,很多库都提供一个叫LookAt的函数,可以定义该视图矩阵. 该函数的原型是 Mat4x4 LookAt(pos: vector3D, target: ...

  3. nodejs回调函数理解

    回调实例 问题:想要得到一秒后 计算出的结果 //错误写法function add(x,y) {console.log(1);setTimeout(function () {console.log(2 ...

  4. OpenGL画矩形函数:glRectf,四个参数分别表示了位于对角线(左下到右上)上的两个点的横纵坐标

    OpenGL画矩形函数:glRectf glRectf:画一个矩形,四个参数分别表示了位于对角线(左下到右上)上的两个点的横纵坐标(并且以窗口的中心点为原点,相当于以它为原点建立了一个二维坐标系) 例 ...

  5. ML之MIC:利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数、最大信息系数MIC)

    ML之MIC:利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数.最大信息系数MIC) 目录 利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数.最大信息系 ...

  6. OpenGL的函数(GL)

    目前OpenGL的函数主要包含在3个库中  1.GL 函数库  2.GLU 函数库  3.GLUT 函数库 1.GL 库函数  颜色编辑  -------------------  glShadeMo ...

  7. 高频交易配对交易学习——Copulas函数理解

    Copulas函数理解 https://github.com/MalteKurz/VineCopulaCPP

  8. Pytorch中tensor.view().permute().contiguous()函数理解

    Pytorch中tensor.view().permute().contiguous()函数理解 yolov3中有一行这样的代码,在此记录一下三个函数的含义 # 例子中batch_size为整型,le ...

  9. pytorch中repeat()函数理解

    pytorch中repeat()函数理解 最近在学习过程中遇到了repeat()函数的使用,这里记录一下自己对这个函数的理解. 情况1:repeat参数个数与tensor维数一致时 a = torch ...

最新文章

  1. 张亚勤、张宏江:人工智能的未来是什么?
  2. Nature发文:深度学习系统为什么这么好骗?
  3. java pdf添加图片水印图片_Java 在PDF中添加文本水印、图片水印
  4. Springboot集成ES启动报错
  5. 设置Java JDK的默认编码为UTF-8
  6. Java 算法 身份证排序
  7. viper4android 魅族6,手机资讯导报:魅族自曝新旗舰PRO6摄像头不凸起
  8. 佛祖保佑,永无BUG
  9. 贺利坚老师汇编课程55笔记:带借位减法指令SBB
  10. [转]中国七大顶级黑客X档案
  11. java会议室预约系统源码_基于jsp的会议室预订预约-JavaEE实现会议室预订预约 - java项目源码...
  12. 蓝芯保护卡_蓝芯防毒卡无忧版
  13. JPA中@Basic注解详解
  14. Mac怎么切换主显示器 Mac设置主显示器
  15. 案例 | 巴别鸟为弘睿构建企业知识库
  16. flink 任务提交问题汇总
  17. 小白MacBook超级实战教程——装双系统WIN10
  18. Tomcat和Java版本对照
  19. SpringCloud 微服务架构开源项目,适合接私活、毕业设计(附源码)
  20. mysql数据库中count的作用_MySQL数据库中的count的用法

热门文章

  1. java题库难_为什么平常写项目感觉java也不是那么难,一到面试刷题得时候感觉那么吃力呢。你们呢?...
  2. Linux C++ 信号量学习 sem_init sem_post sem_wait sem_timedwait
  3. C/C++程序员是什么让你有如此优势?音视频开发该怎么学?
  4. 天蝎项目整机柜服务器技术规范v1.01,天蝎项目整机柜服务器技术规范v1.01
  5. selenium自动化测试随笔,安装selenium
  6. 12.一键导出微信读书的书籍和笔记
  7. 时间计算题100道_2019消防工程师考试易考6大类型计算题
  8. MySQL中什么是码_数据库中的码是什么含义?
  9. 学习笔记(2):Java面试:核心考点突击大串讲-Redis的持久化机制
  10. 深入理解计算机系统-cachelab