OpenGL LookAt函数理解
前言:记录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函数理解相关推荐
- 第七课,OpenGL之LookAt函数
观察空间 通过给定摄像机位置,摄像机焦点,摄像机顶部分向量,可得到摄像机的固定位置. glm::lookAt(cameraPos, cameraFocus, cameraUp); LookAt函数提供 ...
- 推导LookAt函数定义的视图矩阵
在OpenGL中需要定义一个视图(view)矩阵,很多库都提供一个叫LookAt的函数,可以定义该视图矩阵. 该函数的原型是 Mat4x4 LookAt(pos: vector3D, target: ...
- nodejs回调函数理解
回调实例 问题:想要得到一秒后 计算出的结果 //错误写法function add(x,y) {console.log(1);setTimeout(function () {console.log(2 ...
- OpenGL画矩形函数:glRectf,四个参数分别表示了位于对角线(左下到右上)上的两个点的横纵坐标
OpenGL画矩形函数:glRectf glRectf:画一个矩形,四个参数分别表示了位于对角线(左下到右上)上的两个点的横纵坐标(并且以窗口的中心点为原点,相当于以它为原点建立了一个二维坐标系) 例 ...
- ML之MIC:利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数、最大信息系数MIC)
ML之MIC:利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数.最大信息系数MIC) 目录 利用有无噪音的正余弦函数理解相关性指标的不同(多图绘制Pearson系数.最大信息系 ...
- OpenGL的函数(GL)
目前OpenGL的函数主要包含在3个库中 1.GL 函数库 2.GLU 函数库 3.GLUT 函数库 1.GL 库函数 颜色编辑 ------------------- glShadeMo ...
- 高频交易配对交易学习——Copulas函数理解
Copulas函数理解 https://github.com/MalteKurz/VineCopulaCPP
- Pytorch中tensor.view().permute().contiguous()函数理解
Pytorch中tensor.view().permute().contiguous()函数理解 yolov3中有一行这样的代码,在此记录一下三个函数的含义 # 例子中batch_size为整型,le ...
- pytorch中repeat()函数理解
pytorch中repeat()函数理解 最近在学习过程中遇到了repeat()函数的使用,这里记录一下自己对这个函数的理解. 情况1:repeat参数个数与tensor维数一致时 a = torch ...
最新文章
- 张亚勤、张宏江:人工智能的未来是什么?
- Nature发文:深度学习系统为什么这么好骗?
- java pdf添加图片水印图片_Java 在PDF中添加文本水印、图片水印
- Springboot集成ES启动报错
- 设置Java JDK的默认编码为UTF-8
- Java 算法 身份证排序
- viper4android 魅族6,手机资讯导报:魅族自曝新旗舰PRO6摄像头不凸起
- 佛祖保佑,永无BUG
- 贺利坚老师汇编课程55笔记:带借位减法指令SBB
- [转]中国七大顶级黑客X档案
- java会议室预约系统源码_基于jsp的会议室预订预约-JavaEE实现会议室预订预约 - java项目源码...
- 蓝芯保护卡_蓝芯防毒卡无忧版
- JPA中@Basic注解详解
- Mac怎么切换主显示器 Mac设置主显示器
- 案例 | 巴别鸟为弘睿构建企业知识库
- flink 任务提交问题汇总
- 小白MacBook超级实战教程——装双系统WIN10
- Tomcat和Java版本对照
- SpringCloud 微服务架构开源项目,适合接私活、毕业设计(附源码)
- mysql数据库中count的作用_MySQL数据库中的count的用法
热门文章
- java题库难_为什么平常写项目感觉java也不是那么难,一到面试刷题得时候感觉那么吃力呢。你们呢?...
- Linux C++ 信号量学习 sem_init sem_post sem_wait sem_timedwait
- C/C++程序员是什么让你有如此优势?音视频开发该怎么学?
- 天蝎项目整机柜服务器技术规范v1.01,天蝎项目整机柜服务器技术规范v1.01
- selenium自动化测试随笔,安装selenium
- 12.一键导出微信读书的书籍和笔记
- 时间计算题100道_2019消防工程师考试易考6大类型计算题
- MySQL中什么是码_数据库中的码是什么含义?
- 学习笔记(2):Java面试:核心考点突击大串讲-Redis的持久化机制
- 深入理解计算机系统-cachelab