gluLookAt,它有三类(每类3个)共9个引数:

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,

GLdouble centerx,GLdouble centery,GLdouble centerz,

GLdouble upx,GLdouble upy,GLdouble upz);

你需要分别指定这三类引数,才能完成Camera变换.
1.视线:你不用在gluLookAt中指定视线(从眼到被视物体的向量),但在变换视点(尤其是旋转时),
所作的许多操 作都是针对它进行的,
后面将给出如何计算视线向量的公式.
a.视点:即gluLookAt中eye*的那三个引数,视点指的是一条从原点到眼位置的向量.
从你的座位上站起来,这时你改变的就是视点.
b.视目标:即gluLookAt中center*的那三个引数,视目标指的是一条从原点到被视物体的向量.
水平转动你的脖子,这时你所作的就是改变视目标.
c.仰视向量:即gluLookAt中up*的那三个引数,仰视向量指的是头顶的朝向.
竖直抬起头(‘向上看’),这时改变的就是仰视向量.
[一般来讲,仰视向量用(0,1,0)就可以了,不用再仔细考虑它]

2.很明显,由向量减法 视线 view,视点 pos,视目标 tar

view=tar-pos;
3.Camera的变换也就是改变视线位置(前进或后退),方向(转头)
4.Camera变换Pipeline:

Ⅰ 由pos,tar 计算出 view

Ⅱ 变换view
Ⅲ 将view的x,y,z分量传回pos和tar
Ⅳ 将pos,tar,up传给gluLookAt
C.平移
平移是最简单的,它起的作用是游戏者的前进与后退,你会发现平移其实就是平行移动视线,方向不变.
如下图:

代码讲解:
void Move(float speed) { //speed:指定每按一下键前进多少,我取的是0.3
Vector view=tar-pos; //取得view,Vector不是std::vector

pos.x+=speed*view.x; pos.z+=speed*view.z;

tar.x+=speed*view.x; tar.z+=speed*view.z;

}
//我只希望在平面上移动,所以没有y分量的事.
D.旋转
旋转就是转头操作,比较复杂,一点一点来.
D1.绕任意轴旋转一条向量

Vup⊥Vperp|Vup|=|Vperp|=|Vaux| Vproj⊥Vperpn∥Vprojn为单位向量

绕n旋转V θ度到V’, 求V’

Vproj=|Vproj|/|n| n

n*V=|n||V|cosβ cosβ=|Vproj|/|V| |Vproj|=|V|cosβ

n*V=|n||Vproj| |Vproj|=(n*V)/|n|

Vproj=(n*V)/|n|2 n 因为 n 为单位向量

所以 Vproj=n*V n

Vperp=V-Vproj=V-n*V n

Vup=Vperp×n=(V-n*V n)×n=V×n-n*V(n×n)=V×n
Vaux=-sin(θ-90)Vperp+cos(θ-90)Vup=sin(90-θ)Vperp+cos(90-θ)Vup
=cosθVperp+sinθVup=cosθ(V-n*V n)+sinθ(V×n)

V’=Vperp+Vaux=n*v n+cosθ(V-n*V n)+sinθ(V×n)

 D2.水平转头
水平转头即在XZ平面上绕竖直方向旋转view向量
可看出pos无变化,y分量亦无变化.
XZ平面的旋转矩阵:

[ cosθ 0 -sinθ ]

[ 0 1 0 ]

[ sinθ 0 cosθ ]

取得view: view=tar-pos;
旋转view:

[cosθ 0 -sinθ ]

[view.x view.y view.z] [0 1 0 ]

[sinθ 0 cosθ]

=[view.x*cosθ+view.z*sinθ view.y -view.x*sinθ+view.z*cosθ]

传回tar值:

tar’=pos+view’;


D3.竖直转头
竖直转头即在YZ平面上以垂直于view的直线为轴旋转view向量
侧视示意图:
鸟瞰示意图

取得view: view=tar-pos;

取得 axis: 即旋转view (-π/2)

[0 0 1]

[view.x view.y view.z] [0 1 0]

[-1 0 0]

=[-view.z view.y view.x]

为了用上D1中求得的公式,把axis归一化(Normalize)
绕axis旋转view: (套用D1最后得出的公式)
view’=axis*view axis+cosθ(view-axis*view axis)+sinθ(view×axis);
更新tar值:

tar’=pos+view;

E.鼠标滑动角度计算
我们注意到进行旋转Camera时,需要向程序提供转过的角度(2个)
一个是水平转动角度(转头),一个是竖直转动角度(抬头或低头)
这样计算:
鼠标滑过的距离其实是view向量终点滑过的距离
用滑过的距离(s),view向量的长度(l),求得水平角(a),竖直角(b)
a=arc tan s.x/l b=arc tan s.y/l

OPenGL 内部摄像机(Inside out:Camera)相关推荐

  1. OpenGL之摄像机

    文章目录 摄像机/观察空间 摄像机位置 摄像机方向 右轴 上轴 Look At 自由移动 移动速度 鼠标输入 缩放 摄像机源码  OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景 ...

  2. OpenGL中摄像机矩阵的计算原理

    OpenGL中摄像机矩阵的计算原理 熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可.下面先介绍下摄 ...

  3. OpenCV安全屏障摄像机Security Barrier Camera的实例(附完整代码)

    OpenCV安全屏障摄像机Security Barrier Camera的实例 OpenCV安全屏障摄像机Security Barrier Camera的实例 OpenCV安全屏障摄像机Securit ...

  4. Python+OpenCV:摄像机标定(Camera Calibration)

    Python+OpenCV:摄像机标定(Camera Calibration) 理论 Some pinhole cameras introduce significant distortion to ...

  5. 【Modern OpenGL】摄像机系统 Camera

    说明:跟着learnopengl的内容学习,不是纯翻译,只是自己整理记录.  强烈推荐原文,无论是内容还是排版. 原文链接  本文地址:http://blog.csdn.net/aganlengzi/ ...

  6. OpenGL | 放置摄像机gluLookAt函数

    一.gluLookAt函数 gluLookAt用来定义观察者(相机)的状态,包括观察者在世界坐标系中所处的位置.看向世界坐标系中的方向(可以理解为眼睛所看向的方向).观察者头部的朝向(可以在一个平面上 ...

  7. 网络摄像机(ip camera)安装设置步骤

    IP网 络摄像机 是基于互联网和局域网(LAN) 设计的.在一个局域网中,IP网络 摄 像机被允许从本地接入,通过计算机网络的相关配置,您可以不仅可以在本地使用IP 网络摄像机进行监控,而且可以通过互 ...

  8. camera中文版软件 ip_网络摄像机监控(IP Camera Viewer Pro)

    IP Camera Viewer是一个方便可靠能够通过IP地址监控多台摄像机的工具. 功能: 你可以在几分钟之内设置一个免费的IP摄像监控系统, 保持在家里,办公室,停车场或任何地方,你都可以监控. ...

  9. C++ opengl 放置摄像机

    放置摄像机 在场景绘制之前摆放摄像机 [把摄像机摆好了,才能看到东西] gluLookAt 前3个参数为:摄像机的位置: 中间3个参数:眼睛看到的视点: 后3个参数:从头顶发出去的方向向量: 犹如人看 ...

最新文章

  1. 这些编程语言程序员工资最高!Java才第四
  2. Coursera吴恩达《卷积神经网络》课程笔记(3)-- 目标检测
  3. boost::sort模块实现弦平面稳定测试
  4. n个1组成的整数能被2013整除c语言,求大神解算法,“编写程序,求n至少为多大时,n个1组成的整数能被2013 整除。”...
  5. vue中v-html指令的使用之Vue知识点归纳(三)
  6. 浅谈K短路算法(KSP)之二(YEN .J算法求解)
  7. andriod环境搭建
  8. 第一:如何解决robot framework log.html中的中文乱码问题
  9. 视频怎么插入慢动作?
  10. iOS Android 上传代码库+持续集成+单元测试
  11. java 环境变量 ln s_java的环境变量
  12. kindle电子书转换成pdf azw转pdf
  13. 性能测试实战脚本—服务器端性能测试的通用脚本
  14. java中括号的匹配_java括号匹配算法
  15. 分布式数据库TiDB在携程的实践
  16. 优锘科技:ThingStudio森工厂掀起数字孪生龙卷风暴
  17. 天生量化将才?理工科程序员 做量化投资优劣势分析
  18. KEIL平台下新建华大HC32F460单片机工程笔记
  19. 深圳市福田区支持文化创意产业发展若干措施
  20. RedHat7.4安装

热门文章

  1. C语言直接清空数组、字符串
  2. The underlying provider failed on Open
  3. 静态页面表格的布局问题--在表格里不能用float来布局,不然你怎么调都发现没用啊。
  4. javascript 老王开车去东北
  5. android开发 Activity包含Fragment切换背景黑色闪屏解决方案
  6. 以下对python程序设计风格_以下对 Python 程序设计风格描述正确的选项是( )
  7. 索尼电视linux系统版本,索尼X9500H智能液晶4K电视加入最新安卓9.0操作系统
  8. 单片机c语言define什么意思,单片机C语言中typedef和define的区别是什么?
  9. autodock-vina分子对接
  10. python中oo是什么意思_python中的OO