3D Computer Grapihcs Using OpenGL - 18 相机移动
移动相机需要用到键盘按键,按键事件的引入需要包含头文件
#include <Qt3DInput\qkeyevent.h>
并实现QWidget中定义的虚函数keyPressEvent
我们首先在MyGlWindow中重写这个虚函数。
在MyGlWindow.h加入
void keyPressEvent(QKeyEvent*);
在MyGlWindow.cpp中定义:
1 void MyGlWindow::keyPressEvent(QKeyEvent * e) 2 { 3 switch (e->key()) 4 { 5 case Qt::Key::Key_W: 6 camera.moveForward(); 7 break; 8 case Qt::Key::Key_S: 9 camera.moveBackward(); 10 break; 11 case Qt::Key::Key_A: 12 camera.strafeLeft(); 13 break; 14 case Qt::Key::Key_D: 15 camera.strafeRight(); 16 break; 17 case Qt::Key::Key_Q: 18 camera.moveUp(); 19 break; 20 case Qt::Key::Key_E: 21 camera.moveDown(); 22 break; 23 24 default: 25 break; 26 } 27 repaint(); 28 }
代码很简单,从中我们可以看到按下W 和 S键会分别前进、后退,按下A和D键会分别向左向右平移,按下Q和E键会分别向上向下平移。
但是目前我们还没有在Camera类中实现这6个移动的函数。
下面就来实现这些函数:
在Camera.h中添加成员:
1 void moveForward(); 2 void moveBackward(); 3 void strafeLeft(); 4 void strafeRight(); 5 void moveUp(); 6 void moveDown(); 7 8 float moveSpeed = 0.1f;
在Camera.cpp中定义这些方法:
1 void Camera::moveForward() 2 { 3 position += viewDirection * moveSpeed; 4 } 5 6 void Camera::moveBackward() 7 { 8 position -= viewDirection * moveSpeed; 9 } 10 11 void Camera::strafeLeft() 12 { 13 glm::vec3 pitchAxis = glm::cross(viewDirection, UP); 14 position += pitchAxis * moveSpeed; 15 } 16 17 void Camera::strafeRight() 18 { 19 glm::vec3 pitchAxis = glm::cross(viewDirection, UP); 20 position -= pitchAxis * moveSpeed; 21 22 } 23 24 void Camera::moveUp() 25 { 26 position += UP * moveSpeed; 27 } 28 29 void Camera::moveDown() 30 { 31 position -= UP * moveSpeed; 32 }
编译运行,我们发现相机可以前进后退上下左右平移了。
PS:
这里的上下并不是依照相机的局部坐标的上下,而是世界坐标的上下。要改成局部坐标的上下有些麻烦。
我做了一些尝试,定义一个新的成员cameraUp,用来表示相机的上方,每次旋转过后都重新使用向量差乘来重新计算cameraUp。这样确实可以按照相机的上下移动,但是带来了一些其他问题,相机在世界中不再是“正”的了,经过几次旋转,会累积一些偏差,导致相机倾斜。这里需要解决这个问题可能需要用到四元数,但是暂时不再深究了。
转载于:https://www.cnblogs.com/AnKen/p/8404418.html
3D Computer Grapihcs Using OpenGL - 18 相机移动相关推荐
- 3D Computer Grapihcs Using OpenGL - 04 First Triangle
本节将绘制一个三角形 先看最终代码: MyGlWindow.cpp: 1 #include <gl\glew.h> 2 #include "MyGlWindow.h" ...
- 《Computer Graphics with OpenGL》计算机图形学读书笔记 02——计算机图形学软件
这里是<Computer Graphics with OpenGL>英文原版第四版的读书笔记,预计每一章写一篇读书笔记.本篇为第二章,简要介绍计算机图形学的相关软件.图形学相关软件可分为两 ...
- Computer Graphics Through OpenGL From Theory to Experiments - 学习笔记2 Tricks of the Trade opengl基础
一个 OpenGL 工具箱 顶点数组及其绘制命令 // // squareAnnulus1.cpp // // 该程序绘制一个方形环作为三角形条带 // 顶点使用 glVertex3f() 指定,颜色 ...
- Vector Math for 3D Computer Graphics
2019独角兽企业重金招聘Python工程师标准>>> http://programmedlessons.org/VectorLessons/vectorIndex.html#09 ...
- OpenGL模拟相机成像
1.针孔相机模型 . S为比例因子 U0,V0 为像主点中心偏移坐标 Ax=f/dx Ay=f/dy f为焦距 dx dy为像素水平方向大小 2.opengl模拟相机成像 矩阵设置 M:模型视图矩阵 ...
- 在3D世界中创建不同的相机模式——检查对象是否可见
2.5 检查对象是否可见 问题 你想检查对象是否可见来决定是否要绘制这个物体. 解决方案 XNA拥有BoundingFrustum类支持这个功能,你可以通过传递View和Projection矩阵创建一 ...
- OpenGL ES 相机 LUT 滤镜
OpenGLES 相机 LUT 滤镜 左侧为 LUT 滤镜效果,右侧为原图 什么是 LUT ? LUT 是 Look Up Table 的简称,称作颜色查找表,是一种针对色彩空间的管理和转换技术. 它 ...
- opencv的pnp()算法接口是相对于3D点,输出的是相机与3D点之间的R和T
1.情况一: 两帧图像 -> 提取特征->特征匹配->通过2d-2d计算 F基础矩阵.E 本质矩阵 .H 单一性矩阵 ->解析出 相机自身的运动R和T ->再通过三角化 ...
- Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision
在上一讲<Coursera自动驾驶课程第7讲:Vehicle Lateral Control>中我们了解了如何对汽车进行横向控制. 本课程第一个篇章就暂时告一段落了,接下来我们开始学习新的 ...
最新文章
- Alpha 冲刺报告(10/10)
- win8+XAML Binding(数据绑定)
- GPU(CUDA)学习日记(九)------ CUDA存储器模型
- 从Chrome源码看audio/video流媒体实现二
- C语言编程规范(排版)
- 2021-02-02 天地图图层类型
- 从Qt的图片文件传输来看Qt 中UDP的收发消息writeDatagram和readDatagram
- python模块--subprocess
- R Markdown与RStudio IDE深度结合
- 用WAIK for Win7制作Winpe3.0
- 语音控制系统(1)-----项目前言
- 新形势下电力监控系统网络安全风险分析与防护对策
- DTCC2019数据风云,十年变迁 第十届中国数据库技术大会隆重启动
- 中兴新支点操作系统_好用的国产操作系统,中兴新支点操作系统U盘启动安装方法教程...
- 汇编语言--计算 ffff:0 ~ ffff:b 单元中的数据的和,存储在 dx 中
- 用python的tkinter包设计一个随机点菜器
- html 怎么在背景图片上添加内容,css 如何在一个背景图片的中间添加文字呢?
- Pikachu靶场暴力破解关卡3
- Elasticsearch系列01:基础教程
- Linux文本三剑客(grep、sed、awk)
热门文章
- php日志缓存,php – Symfony和Docker – 缓存和日志目录权...
- java jdbc 详解_JDBC详解
- java成员访问属性,在Java中,针对类、成员方法和属性提供了四种访问级别,分别是private、static、prot...
- Linux grep命令的一些使用体会
- 六度人和张星亮:SaaS市场要回归TO B本质
- Python的函数式编程--从入门到⎡放弃⎦
- 【02】查询优化的技术范围
- Mysql-5.5.3 主从同步不支持master-host问题的解决办法
- python自动执行脚本
- 字典的定义、字典的特性(成员操作符)