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

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

主要是u,v,w三个向量的计算:

1.w向量:

(1)计算向量eyeToTarget = eye - target;

(2)向量w 等于 向量eyeToTarget与向量UP的叉乘。

2.u向量:向量w与向量UP的叉乘

3.v向量:向量w与向量u的叉乘

使用以上三个向量,按照u,v,w的顺序组建4*4的矩阵,当然上面提到的u,v,w向量都是vec3类型的,每个向量构建矩阵时还缺少第四个分量,接下来分别计算三个向量对应的值:

4.w向量的第四个分量:向量w与eye的点乘

5.u向量的第四个分量:向量u与eye的点乘

6.v向量的第四个分量:向量v与eye的点乘

到此原理部分介绍完毕,下面给出iOS实现的代码:

 1 GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,
 2                                 float centerX, float centerY, float centerZ,
 3                                 float upX, float upY, float upZ)
 4 {
 5     GLKVector3 ev = { eyeX, eyeY, eyeZ };
 6     GLKVector3 cv = { centerX, centerY, centerZ };
 7     GLKVector3 uv = { upX, upY, upZ };
 8     GLKVector3 w = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));//计算摄像机位置与目标点之间的向量,并进行规格化
 9     GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, w));
10     GLKVector3 v = GLKVector3CrossProduct(w, u);
11
12     GLKMatrix4 m = { u.v[0], v.v[0], w.v[0], 0.0f,
13                      u.v[1], v.v[1], w.v[1], 0.0f,
14                      u.v[2], v.v[2], w.v[2], 0.0f,
15                      GLKVector3DotProduct(GLKVector3Negate(u), ev),
16                      GLKVector3DotProduct(GLKVector3Negate(v), ev),
17                      GLKVector3DotProduct(GLKVector3Negate(w), ev),
18                      1.0f };
19
20     return m;
21 }
时间: 2024-11-10 14:08:52

OpenGL中摄像机矩阵的计算原理的相关文章

OpenGL中glPushMatrix和glPopMatrix的原理

glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPushMatrix,然后再调用一堆平移.旋转代码等等,然后再绘图.那些平移和旋转都是基于左上角为原点进行变化的.并且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了. 那假设想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个"状态"了,这个状态就是你调用glPushMa

OpenGL中投影矩阵基础知识

投影矩阵元素Projection Matrix 投影矩阵构建: 当f趋向于正无穷时: 一个重要的事实是,当f趋于正无穷时,在剪裁空间中点的z坐标跟w坐标相等.计算方法如下: 经过透视除法后,z坐标变为1,这意味着被投影的点正好投影到远平面上,其中透视除法是点的x,y,z,w分别除以w.

[OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII

部分 VII摄像机标定和 3D 重构 42 摄像机标定 目标 ? 学习摄像机畸变以及摄像机的内部参数和外部参数 ? 学习找到这些参数,对畸变图像进行修复 42.1 基础 今天的低价单孔摄像机(照相机)会给图像带来很多畸变.畸变主要有两种:径向畸变和切想畸变.如下图所示,用红色直线将棋盘的两个边标注出来,但是你会发现棋盘的边界并不和红线重合.所有我们认为应该是直线的也都凸出来了.你可以通过访问Distortion (optics)获得更多相关细节. 这种畸变可以通过下面的方程组进行纠正: 于此相似

【转】OpenGL和D3D 矩阵对比

矩阵是三维图形学中不可或缺的部分,几乎所有和变换相关的操作都涉及矩阵,世界变换,视图变换,投影变换,视口变换无一不需要矩阵,但是当今的两大主流图形库DirectX和OpenGL对矩阵操作却有着细微的差别,大多数的图形学书籍都以OpenGL为基础进行阐述,游戏编程类的书籍则更多使用DirectX,这就难免产生混淆,今天这篇主要讲讲两者在操作矩阵的时候有何不同. 矩阵 在三维图形学中,一般使用四维矩阵,也就是四行四列的方阵,下面是一个典型的四维矩阵 既然是三维图形学,为什么使用四维矩阵呢?主要有两个

Opengl中矩阵和perspective/ortho的相互转换

Opengl中矩阵和perspective/ortho的相互转换 定义矩阵 Opengl变换需要用四维矩阵.我们来定义这样的矩阵. +BIT祝威+悄悄在此留下版了个权的信息说: 四维向量 首先,我们定义一个四维向量vec4. 1 /// <summary> 2 /// Represents a four dimensional vector. 3 /// </summary> 4 public struct vec4 5 { 6 public float x; 7 public f

计算机图形学OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理,用法 .(转)

单位矩阵 对角线上都是1,其余元素皆为0的矩阵. 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵. 它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0. OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空间中的点(2,3,4),在OpenGL中将表示成(2,3,4,1). 齐次坐标表示方式适合于矩阵运算,也很方便地表示了无穷

[转载]矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先

[转载]http://www.xuebuyuan.com/882848.html (一)首先,无论dx还是opengl,所表示的矢量和矩阵都是依据线性代数中的标准定义的:“矩阵A与B的乘积矩阵C的第i行第j列的元素c(ij)等于A的第i行于B的第j列的对应元素乘积的和.”(实用数学手册,科学出版社,第二版)例如c12 = a11*b11+a12*b21+a12*b13... (二)在明确了这一点后,然后我们再看“矩阵的存储方式”,矩阵存储方式有两种,一种是“行主序(row-major order

OpenGL中平移、旋转、缩放矩阵堆栈操作

在OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现.OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空间中的点(2,3,4),在OpenGL中将表示成(2,3,4,1). 齐次坐标表示方式适合于矩阵运算,也很方便地表示了无穷远的点,比如(1,0,0,0)就表示x轴上无穷远的点,因为1/0是无穷大,这里约定0/0=0. 例:点(1,1,1)将该向量平移变换(2,3,4)个单位,得到

(转)思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...

转自:http://www.cnblogs.com/soroman/archive/2008/03/21/1115571.html 思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用1.矩阵和线性变换:一一对应 矩阵是用来表示线性变换的一种工具,它和线性变换之间是一一对应的.考虑线性变换:a11*x1 + a12*x2 + ...+a1n*xn = x1'a21*x1 + a22*x2 + ...+a2n*xn = x2'...am1*x1 + am2*x2 + ...+amn*x