移动相机需要用到键盘按键,按键事件的引入需要包含头文件

#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 相机移动相关推荐

  1. 3D Computer Grapihcs Using OpenGL - 04 First Triangle

    本节将绘制一个三角形 先看最终代码: MyGlWindow.cpp: 1 #include <gl\glew.h> 2 #include "MyGlWindow.h" ...

  2. 《Computer Graphics with OpenGL》计算机图形学读书笔记 02——计算机图形学软件

    这里是<Computer Graphics with OpenGL>英文原版第四版的读书笔记,预计每一章写一篇读书笔记.本篇为第二章,简要介绍计算机图形学的相关软件.图形学相关软件可分为两 ...

  3. Computer Graphics Through OpenGL From Theory to Experiments - 学习笔记2 Tricks of the Trade opengl基础

    一个 OpenGL 工具箱 顶点数组及其绘制命令 // // squareAnnulus1.cpp // // 该程序绘制一个方形环作为三角形条带 // 顶点使用 glVertex3f() 指定,颜色 ...

  4. Vector Math for 3D Computer Graphics

    2019独角兽企业重金招聘Python工程师标准>>> http://programmedlessons.org/VectorLessons/vectorIndex.html#09 ...

  5. OpenGL模拟相机成像

    1.针孔相机模型 . S为比例因子 U0,V0 为像主点中心偏移坐标 Ax=f/dx Ay=f/dy  f为焦距 dx dy为像素水平方向大小 2.opengl模拟相机成像 矩阵设置 M:模型视图矩阵 ...

  6. 在3D世界中创建不同的相机模式——检查对象是否可见

    2.5 检查对象是否可见 问题 你想检查对象是否可见来决定是否要绘制这个物体. 解决方案 XNA拥有BoundingFrustum类支持这个功能,你可以通过传递View和Projection矩阵创建一 ...

  7. OpenGL ES 相机 LUT 滤镜

    OpenGLES 相机 LUT 滤镜 左侧为 LUT 滤镜效果,右侧为原图 什么是 LUT ? LUT 是 Look Up Table 的简称,称作颜色查找表,是一种针对色彩空间的管理和转换技术. 它 ...

  8. opencv的pnp()算法接口是相对于3D点,输出的是相机与3D点之间的R和T

    1.情况一: 两帧图像 -> 提取特征->特征匹配->通过2d-2d计算 F基础矩阵.E 本质矩阵 .H  单一性矩阵 ->解析出 相机自身的运动R和T ->再通过三角化 ...

  9. Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision

    在上一讲<Coursera自动驾驶课程第7讲:Vehicle Lateral Control>中我们了解了如何对汽车进行横向控制. 本课程第一个篇章就暂时告一段落了,接下来我们开始学习新的 ...

最新文章

  1. Alpha 冲刺报告(10/10)
  2. win8+XAML Binding(数据绑定)
  3. GPU(CUDA)学习日记(九)------ CUDA存储器模型
  4. 从Chrome源码看audio/video流媒体实现二
  5. C语言编程规范(排版)
  6. 2021-02-02 天地图图层类型
  7. 从Qt的图片文件传输来看Qt 中UDP的收发消息writeDatagram和readDatagram
  8. python模块--subprocess
  9. R Markdown与RStudio IDE深度结合
  10. 用WAIK for Win7制作Winpe3.0
  11. 语音控制系统(1)-----项目前言
  12. 新形势下电力监控系统网络安全风险分析与防护对策
  13. DTCC2019数据风云,十年变迁 第十届中国数据库技术大会隆重启动
  14. 中兴新支点操作系统_好用的国产操作系统,中兴新支点操作系统U盘启动安装方法教程...
  15. 汇编语言--计算 ffff:0 ~ ffff:b 单元中的数据的和,存储在 dx 中
  16. 用python的tkinter包设计一个随机点菜器
  17. html 怎么在背景图片上添加内容,css 如何在一个背景图片的中间添加文字呢?
  18. Pikachu靶场暴力破解关卡3
  19. Elasticsearch系列01:基础教程
  20. Linux文本三剑客(grep、sed、awk)

热门文章

  1. php日志缓存,php – Symfony和Docker – 缓存和日志目录权...
  2. java jdbc 详解_JDBC详解
  3. java成员访问属性,在Java中,针对类、成员方法和属性提供了四种访问级别,分别是private、static、prot...
  4. Linux grep命令的一些使用体会
  5. 六度人和张星亮:SaaS市场要回归TO B本质
  6. Python的函数式编程--从入门到⎡放弃⎦
  7. 【02】查询优化的技术范围
  8. Mysql-5.5.3 主从同步不支持master-host问题的解决办法
  9. python自动执行脚本
  10. 字典的定义、字典的特性(成员操作符)