openGL投影矩阵原理及数学推导
用OpenGL生成三维投影模型的研究

33发展 区域 经济 发 展民族 特色 企业 .
新 疆 经济 欠发 达 ,尤 其 是南 疆 和 北 疆、 农村 和 城 市 的 差距
业 。新 疆 的 经济 欠 发 达 ,从 内地 招 商 引 资 的企 业较 多 ,具 有 民 更是 显 而 易见 。 努 力发 展 区域 经 济 ,缩 小 南 疆与 北 疆 、农 村和 族特 色 的企 业 太 少 ,而后 者 才是 真 正 吸 引少 数 民族 大 学 生就 业 城 市 的差距 ,有 利于 缓解 大学 生集 中地域 就业 的 问题 。 的重要途 径 1 ,所 以少数 民族大 学生 到企业 就业 很难 。 3 】
3 4 家应 给予 多方面 的扶 持与 优惠政 策 .国
21 0 0年 5月 ,中 央 新 疆 工 作 座 谈 会胜 利 召 开 , 意 味着 新 疆 迎来 了新 的发 展机 遇 。国 家应 积极 推进 双语 教 学和 民 汉合校 , 大 力加 强 基础 教 育 师 资 队伍 的 建设 。加 大 对 自治 区各 高校 的投
31 . 少数 民族 大学 生应 努 力提 高 自身 的综合 素质 能力 信 息 时 代 下 ,少 数 民族 毕 业 生要 努 力 提高 自身 素质 ,同 时 应更 新观念 , 立正确 的择业 观 , 需要和 适合 自己的地 方就业 。 树 到 32转变学校教育模式 以及加强对少数 民族 大学生就业的指导 . 现 行 的 大 学教 育 模 式 应 适 应 2 1世纪 国家 人 才 培 养 的 战 略 需 要。 新 疆 高校 教 育 方 法、 考核 方法相 对 落 后 ,无 法 全面 促 进 当代 大学 生提 高 自 己的综 合素 养 。学校 在专 业 结构 、课 程设 置 、 教学 改 革 、师资 配置 、教材 选定 等 方面进 行决 策时 , 充 分征 求 应 学 校 的就 业 指 导 中 心的 建议 和 意 见 , 到信 息 畅通 , 做 对症 下 药 , 把 好质量 关 和特 色关 [。 4 1 信 息 时 代 少数 民族 学 生获 取 有效 的就业 信 息 相 对较 少 ,为 此学校应 当通过各种途径特别是现代 的信息工具为少数 民族学 生提 供 更 多有 效 的 就业 信 息 。学 校 在新 生 入 学时 ,就应 该 安 排
投影矩阵

一般的错切
后裁剪面 对象
前裁剪面 投影平面
顶视图和侧视图
θ φ
xp = x – z cot θ
yp = y – z cot φ
错切矩阵
xy 错切(z值不变)
⎡1 ⎢0 H(θ , φ ) = ⎢ ⎢0 ⎢ ⎣0 0 − cot θ 1 − cot φ 0 1 0 0 0⎤ 0⎥ ⎥ 0⎥ ⎥ 1⎦
称这个视景体为正则视景体(canonical view volume)
正交规范化
glOrtho(left, right, bottom, top, near, far) 规范化 ⇒ 求出把指定裁剪体转化为默认裁剪体的变换 (right, top, −far) (1, 1, −1)
(left, bottom, −near)
• •
这些变换都是非奇异的 默认值为单位阵(正交视图)
规范化使得不管投影的类型是什么,都是相对 于默认的简单立方体进行裁剪 能的保留深度信息,这对隐藏面消除是非 常重要的
正则视景体
OpenGL缺省的视景体是中心在原点,边长 为2的立方体,相当于调用
glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
OpenGL的透视
glFrustum可以定义非对称视景体,但 gluPerspective不能做到这一点
OpenGL透视矩阵
glFrustum的规范化
• 剪切变换H:把非对称视景棱台变换为对称的 • •
四棱台,远近平面不变 缩放变换S:把四棱台的侧面变换为x= ±z和y= ±z,远近平面不变 透视规范化变换N: x= ±z变换为x= ±1, y= ±z变换为y= ±1,近平面z=-near变换为z=-1, 远平面z=-far变换为z = 1
glm 四元数转换矩阵-概述说明以及解释

glm 四元数转换矩阵-概述说明以及解释1.引言1.1 概述四元数(Quaternion)是数学中的一种扩展复数,广泛应用于3D计算机图形学和空间几何运算等领域。
它由一个实部和三个虚部组成,具有一些独特的性质和优点。
在图形学中,四元数被用于表示和计算物体的旋转,相比其他表示旋转的方法,如欧拉角和旋转矩阵,四元数具有更简洁和高效的计算方式。
本文将首先介绍球面线性插值(Spherical Linear Interpolation, 简称SLERP)的概念及其在计算机图形学中的应用。
接下来,我们将详细探讨四元数的定义和性质,包括四元数的运算法则、单位四元数的特点等。
最后,我们将重点讲解四元数与旋转矩阵之间的相互转换关系,包括如何将一个旋转矩阵转换为对应的四元数表示,以及如何从四元数恢复出旋转矩阵。
通过深入理解四元数与旋转矩阵之间的转换关系,我们可以更好地理解和应用四元数在3D图形学中的作用。
对于计算机图形学从业者来说,这是一个非常重要的基础知识。
此外,我们还将展望四元数在虚拟现实、计算机动画等领域的应用前景,并提出相关讨论和建议。
通过阅读本文,读者将能够理解四元数转换矩阵的原理和算法,并能够应用于实际问题中。
无论是从事计算机图形学研究还是从事相关行业工作的人士,本文的内容都将对他们的工作产生积极的影响和帮助。
总结起来,本文旨在为读者提供一份系统而全面的关于glm四元数转换矩阵的学习材料,并希望能够激发更多人对这一领域的兴趣和研究。
1.2文章结构文章结构部分的内容可以写成以下样式:2. 正文2.1 球面线性插值2.2 四元数的定义和性质2.3 四元数到旋转矩阵的转换在正文部分,我们将着重介绍GLM(OpenGL 数学库)中的四元数转换矩阵的相关知识。
首先,我们将会详细讨论球面线性插值算法的原理和应用,以便更好地理解四元数和矩阵之间的转换关系。
接下来,我们将会介绍四元数的定义和性质。
四元数是一种复数的扩展形式,具有独特的性质和运算规则。
OpenGL学习笔记:三维数学基础(一)坐标系、向量、矩阵

OpenGL学习笔记:三维数学基础(⼀)坐标系、向量、矩阵接触OpenGL和计算机图形学有⼀段时间了,⼀直想写⼀点东西,记录⾃⼰的学习历程,或许也能够为有意愿向计算机图形学发展的菜鸟们提供⼀条捷径。
闲话不多说,本章主要介绍计算机图形学中三维数学的⼀些基础知识,主要包括2D、3D笛卡尔坐标系,向量、矩阵的数学和⼏何意义以及公式。
由于篇幅限制,其中的推导过程本⽂不作叙述,感兴趣的读者可以去看《3D数学基础+图形与游戏开发》,已上传,链接地址在本⽂末尾。
⼀、计算机图形学计算机图形学(Computer Graphics)是⼀种使⽤数学算法将⼆维或三维图形转化为计算机显⽰器的栅格形式的科学。
其⼴泛应⽤于游戏、动画、仿真、虚拟现实(VR)、增强现实(AR)等领域。
在数学之中,研究⾃然数和整数的领域称为离散数学,研究实数的领域称作连续数学。
在计算机图形学中,为虚拟世界选择度量单位的关键是选择离散的精度。
⼀种错误的观点认为short、int是离散的,⽽float、double是连续的,⽽事实上,这些数据类型都是离散的。
于是,计算机图形学有如下准则:计算机图形学第⼀准则:近似原则——如果它看上去是对的,它就是对的。
⼆、笛卡尔坐标系2D笛卡尔坐标系是⼀个精确定位点的框架。
2D坐标的标准表⽰法是(x,y),相信⼤家初中都学过。
⼀般,标准的笛卡尔坐标系是x轴向右,y轴向上。
⽽计算机图形学中的屏幕坐标往往是x轴向右,y轴向下。
如图1所⽰。
图1:2D笛卡尔坐标系和2D屏幕坐标系3D笛卡尔坐标系类似,增加了第三个维度,z轴。
3D坐标系分为完全不同的2种坐标系,左⼿坐标系和右⼿坐标系。
判断⽅法为,左⼿坐标系:伸出左⼿,让拇指和⾷指成“L”形,⼤拇指向右,⾷指向上,其余⼿指指向前⽅。
此时,拇指、⾷指和其余三指分别代表x、y、z轴的正⽅向。
右⼿坐标系,相同,只是把左⼿换成右⼿。
如图2所⽰。
图2:左⼿坐标系与右⼿坐标系其中左⼿坐标系⼴泛应⽤于计算机图形学、D3D之中,⽽右⼿坐标系⼴泛应⽤于OpenGL、线性代数、3DSMax之中。
投影矩阵的推导

投影矩阵的推导(OpenGL D3D)OpenGL矩阵推导——模型视图变化在三维编程中,模型视图变换是从三维世界到二维屏幕中一个很重要的变换,但是这个变换往往很多人都不太理解,要么是事而非。
而这方面的文章不是太少就是讲的太浅没有真正的理解模型视图变换,本人在这个过程中曾经走过很多歪路,不过好在最终在自己的不懈努力下终于降伏了这只猛虎。
本人就以自己的理解,通过矩阵推导过程一步一步来了解模型视图变化,最后通过两个OpenGl的程序来进一步理解模型视图矩阵。
先从一个基本的模型视图—透视投影变换讲起。
透射投影是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume 以下简称CVV)中,待裁剪完毕后进行透视除法的行为。
透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。
其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。
主流的3D APIs 都把透射投影的具体细节进行了封装,从而只需一个函数便可生成一个透射投影矩阵比如gluPerspective(),使得我们不需要了解其算法便可实现三维到二维的转化,然而实事是,一些三维图形或游戏开发人员遇到一些视图矩阵的问题往往会不知所措,比如视景体裁剪。
以下部分内容是从别处那转过来的,主要感谢Twinsen和一个叫丁欧南的高中生。
透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概念,这里我们先把它理解清楚。
齐次坐标对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c (1)而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得p–o = p1 a + p2 b + p3 c (2)从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p –o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:p = o + p1 a + p2 b + p3 c (3)(1)(3)是坐标系下表达一个向量和点的不同表达方式。
关于OPENGL中与鼠标交互的矩阵算法

移动的方向
放大距离
最后是放大缩小: 算法思想:直接glScalef即可
得到矩阵
边缘的地方 上下左右移动,就 是绕轴转动
�
得到鼠标移动的垂直矢量 放大旋转系数 模化矢量
矩阵相乘得到新的矢量பைடு நூலகம்
其次是移动: 算法思想:当鼠标按下并且移动的时候,会产生2D的矢量,移动的方向就是这个 2D的矢量, 将他投影到当前的矩阵中, 得到一个3D的矢量,最后用glTranslatef来乘以当前的矩阵,达到移动的目的
得到鼠标的移动方向
移动距离 模化矢量
用鼠标控制视图的旋转,缩放,平移是CAD软件不可缺少的一个重要部分, 常见的方法有轨迹球法,在网上可以找到,就是NeHe OpenGL 的第48课, 我这里运用的是矩阵相乘得到的矢量来达到目的的.
轨迹球法在边缘的地方 上下左右移动,会感觉 是转动
首先是旋转: 算法思想:当鼠标按下并且移动的时候,会产生2D的矢量,旋转的方向是这个 2D的矢量的垂直矢量,计算出这个2D的矢量,然后将他投影到当前的矩阵中, 得到一个3D的矢量,最后用glRotatef来乘以当前的矩阵,达到旋转的目的
投影矩阵

22
投影矩阵
P =NSH =
2zmin
xm
ax
xm
in
0
0
0
0
2 z m in ymax ymin
0 0
xmax xmin
xmax xmin ymax ymin
ymax ymin far near
far near 1
0
0
2far
near
far near
投影矩阵P = STH把原来的裁剪体 变换为默认的裁剪体
DOP
对象
远面
近面
裁剪体
顶视图 x = -1
z= 1
DOP
x=1 z = -1
变形后的对象
14
简单透视
考虑简单透视:COP在原点,近裁剪面 在z = -1,由平面x = ± z, y = ±z确定的 有90度的视野
15
透视矩阵
齐次坐标下的简单投影矩阵为
0
23
为何采取这种方法?
规范化使得只需要一个流水线体系 就可以进行透视投影和正交投影
尽可能位于四维齐次空间中,以便 保持隐藏而消除和明暗处理所需要 的三维信息
简化了裁剪的操作
24
20
OpenGL 的透视
glFrustum 可以定义非对称视景体, 但 gluPerspective 不能做到
21
OpenGL 透视矩阵
在glFrustum中的规范化需要进行一 个初始剪切变换,从而形成一个视 景棱台,接着进行放缩变换,得到 规范后的透视视景体。最后,透视 矩阵导致只需要最后的正交变换:
倾斜投影= 剪切+正交投影
10
一般的剪切
顶视图
OpenGL空间(坐标系)变换

OpenGL空间(坐标系)变换⽹友的《3D图形学的学习策略》⼀⽂使我深受启发,在图形学以及openGL学习⽅⾯给了我很有价值的指导性意见,在此对前辈们的不吝赐教表⽰感激,谢谢你们的⽆私分享。
如⽂章所说,API是⼯具,不是本质,OpenGL/Direct3D的本质是图形学,⽽不是OpenGL/Direct3D的本⾝,API的本⾝只是⼀些Interface⽽已。
最重要的,最根本的是,你要明⽩这些API背后的图形学的原理---因为那才是根本中的根本。
其实很多事情,包括学习也涉及到⽣活,只有抓住了本质,才能体会到其中的真谛。
带着这种希望探究本质的学习⽅法,结合图形学原理,通过阅读书⽬和⽹友们的⽂章,我对OpenGL⼏何空间变换进⾏了总结性的学习。
OpenGL处理管线的⽬的是将对象的三维描述转换为可以显⽰的⼆维图像。
为了完成这个从三维到⼆维的转换,OpenGL 使⽤了多个空间(坐标系),每个空间完成特定的任务,从⼀个空间到另⼀个空间需要进⾏空间转换。
理解OpenGL所使⽤的各种空间以及它们间的变换是⾮常重要的。
如上图所⽰,openGL中使⽤的空间依次是:对象空间、世界空间、视点空间、裁剪空间、归⼀化设备空间、窗⼝空间、屏幕空间。
结合⾃⼰的理解,就每个空间完成的基本任务和空间的变换关系,总结如下。
对象空间。
对象空间中完成的最⼤任务是对象建模,三维对象的属性,包括顶点位置和表⾯法线等是在这个空间内指定的。
这个空间的坐标原点⼀般在对象上,有时候也在其他地⽅,主要是为了建模⽅便。
每⼀个对象都有⼀个⾃⼰的对象空间。
就openGL⽽⾔,我⽬前还没有接触到建⽴很复杂模型的应⽤,建模⼀般在其他地⽅如3DMAX中完成,然后读⼊openGL进⾏处理。
世界空间。
对象空间之后是世界空间,我理解为世界坐标系是固定不变的。
世界空间主要是对三维场景进⾏描述,就是把已经建⽴的各种对象摆放在三维空间中,空间的转换是通过模型变换完成的。
可以通过平移、旋转、⽐例缩放等把对象摆放在需要的位置,就好像买好家具以后设计房间布局⼀样。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
openGL投影矩阵
概述
显示器是2d的。
3d场景需要转换为2d图像才能显示在屏幕上。
投影矩阵(GL_PROJECTION)用于完成这个工作。
投影矩阵将观察坐标(eye coordinates)转换成裁剪坐标(clip coordinates)。
然后,裁剪坐标被除以w,转换为规范化的设备坐标(NDC)。
需要记住的一点是,裁剪操作和规范化都由投影矩阵(GL_PROJECTION)完成。
下面介绍如何用6个参数(left,right,bottom,top,near,far)构建投影矩阵。
裁剪(clipping)操作是在裁剪坐标上进行的,安排在透视除法执行之前。
裁剪坐标xc,yc,zc同wc比较,若每个分量都落在(-wc,wc)外,那么此坐标将被裁剪掉。
在透视投影中,3d场景中的点(观察坐标)从平截头体中映射到正方体(NDC)中;x坐标从[l,r]映射到[-1,1],y坐标从[b,t]映射到[-1,1],z坐标从[n,f]映射到[-1,1]。
注意到,观察坐标系是右手系,规范设备坐标系是左手系。
这就有,在观察坐标系中,摄像机朝向沿着-z,而在NDC中,方向沿着z。
由于glFrustum()只接受正参数,所以构造投影矩阵的时候要变号。
openGL中,3d场景中,观察坐标系下的点被投影到近投影面。
下图展示了观察坐标系点(xe,ye,ze)投影到近投影面上的点(xp,yp,zp)。
从Top View of Projection看,xe投影到xp,根据等比性质:
从Side View of Projection看,yp计算类似:
注意到,xp和yp依赖于-ze,这一点要引起重视。
在观察坐标被投影矩阵转换为裁剪坐标后,裁剪坐标仍然是同质坐标。
在规范化阶段执行透视除法变为规范设备坐标(NDC)。
因此,可以将wc的值定为-ze。
投影矩阵最后一行为(0,0,-1,0)
下一步,将xp,yp映射到xn,yn,此为线性映射[l,r]=>[-1,1],[b,t]=>[-1,1]:
将xp,yp带入上面结果:
对比(xc/wc,yc/wc)wc=-ze得出上式括号中分别为xc,yc。
由上式的结果可以观察出投影矩阵的第一行、第二行值:
现在只差第三行。
Ze总是映射到-n,但是又需要有区分的z值用于裁剪和深度测试,也需要能够实现逆变换。
我们看到,z是不依赖x或y,可以借助wc来分析zn和ze的关系。
我们设投影矩阵如下:
在观察坐标系中,we等于1,则有:
Ze=-n时,zn=-1;ze=-f时,zn=1,将其带入上式有:
有(1)有:
带入(2)有:
将A带入(1)有:
将A、B带入zn,ze关系式:
最后得到投影矩阵:
当视见体是对称的,有r=-l,t=-b,则:
由(3)式看到,ze和zn成反比,ze去[-f,-n],有图像看出,在近投影面zn有较高精度,在远投影面精度低,当区间[-f,-n]增大时,靠近远投影面的点的zn由于过分靠近而超出计算机最大精度(z-fighting),即ze在较远处的细小差别不能在zn上得到表达,而具有相同的zn值。
所以,区间[-f,-n]应尽可能短,以避免精度问题。
正投影
不存在透视计算,要做的只是将一个长方体映射成正方体。
齐次项w不再需要,第四行写为(0,0,0,1):
当是对称情况时,r=-l,t=-b:。