`
chriszeng87
  • 浏览: 738833 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OpenGL 矩阵变换

阅读更多

Overview

几何数据——顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组合操作改变这些数据。

OpenGL vertex transformation

Object Coordinates

对象的本地坐标系——任何变换之前的最初位置.为了变换(transformation)这些对象,可以调用glRotate(),glTranslatef(),glScalef()这些方法。

 

Eye Coordinates

使用GL_MODELVIEW矩阵和Object 坐标相乘所得。在OpenGL中用GL_MODELVIEW将对象对象空间(Object Space)变换到视觉空间(eye space)。GL_MODELVIEW

矩阵是模型矩阵(Model Matrix)和视觉矩阵(View Matrix)的组合 (Mview * Mmodel)。其中,Model 变换指的是将Object  Space转换到World Space

(译注:World Space值得是OpenGL中的三维空间),而View 变换是将World space变换到eye space。

OpenGL eye coordinates

注意:在OpenGL中没有单独的camera(view) matrix。因此,为了模拟camera或者view的变换,其中的场景(3D物体和光照)必须通过和view相反的方向变换。也就是说,OpenGL总是将camera定义在(0,0,0)点,并且强制在eye space坐标系的-Z轴方向,而且不能变换。关于GL_MODELVIEW Matrix的详细资料可以查看此处:http://www.songho.ca/opengl/gl_transform.html#modelview

 

标准向量(Normal vectors)——从对象坐标系(Object coordinates)变换到视觉坐标系(eye coordinates),它是用来计算光照(lighting calculation)的.注意标准向量(Normal vectors)的变换和顶点的不同。其中视觉矩阵(view matrix)是GL_MODELVIEW逆矩阵的转置矩阵和标准向量(Normal vector是)相乘所得,即:

normal vector transformation

更多关于标准向量变换(Normal Vector Transformation)的资料可连接到此处:http://www.songho.ca/opengl/gl_normaltransform.html

 

剪切面坐标系(Clip Coordinates)

视觉坐标系和GL_PROJECTION矩阵相乘,得到剪切面坐标系。GL_PROJECTION矩阵定义了可视的空间(截头锥体)(译注:关于什么是截头锥体,我还查了下资料,发现它是这个样子的:


 

,这个就是投影的效果啦)以及顶点数据如何投影到屏幕上(视角或者正交化(orthogonal)),它被称为剪切面坐标系的原因是(x,y,z)变换之后

要和±w比较。更多关于GL_PROJECTION矩阵的资料可见:http://www.songho.ca/opengl/gl_transform.html#projection

OpenGL clip coordinates

 

标准化设备坐标系(NDC)

将剪切面坐标系除以w所得(关于w的讨论可见此处:,http://www.songho.ca/math/homogeneous/homogeneous.html),它被称为视角除法(perspective division)

.它更像是窗口坐标系,只是还没有转换或者缩小到屏幕像素。其中它取值范围在3个轴向从-1到1标准化了。

OpenGL Normalized Device Coordinates

 

 

窗口坐标系(Window Coordinates)/屏幕坐标系(Screen Coordinates)

将标准化设备坐标系(NDC)应用于视口转换。NDC将缩小和平移以便适应屏幕的透视。窗口坐标系最终传递给OpenGL的管道处理变成了fragment。glViewPort()函数

用来定义最终图片映射的投影区域。同样,glDepthRange()用来决定窗口坐标系的z坐标。窗口坐标系由下面两个方法给出的参数计算出来

glViewPort(x,y,w,h);

glDepthRange(n,f);

 

OpenGL Window Coordinates

 

视口转换公式很简单,通过NDC和窗口坐标系的线性关系得到:

 

OpenGL 转换矩阵

OpenGL Transform Matrix

 

OpenGL使用4x4矩阵变换。注意,这16个元素存储在1D数组中,这些元素按列顺序排列。假如你想以行为顺序排列,你需要转置该矩阵。

OpenGL有4中不用的矩阵:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE和GL_COLOR.你可以在

代码中使用glMatrixMode()函数改变当前的类型。例如,为了选择GL_MODELVIEW矩阵,可以这样:

glMatrixMode(GL_MODELVIEW);

 

---------------------------------------------------------------------------------------------------------------------------------------------

Model-View 矩阵(GL_MODELVIEW)

GL_MODELVIEW矩阵在一个矩阵中包含view矩阵和model 矩阵,为了变换view(camera),你需要将整个

场景施以逆变换。gluLookAt()用来设置viewing变换。

 

最右边的三个矩阵元素 (m12m13m14) 是用作位移变换的。m15元素是齐次坐标。(何为齐次坐标,参见:http://www.songho.ca/math/homogeneous/homogeneous.html),该元素是用来投影变换的。

 

(

注意这三个元素集实际上指得是3个正交坐标系:

(

(

(

 

 

Columns of OpenGL ModelView matrix 
4 columns of GL_MODELVIEW matrix

我们能够不使用OpenGL变换函数,直接构造GL_MODELVIEW矩阵。下面有一些有用的代码构建

GL_MODELVIEW矩阵

1. Angles to Axes  

2. Lookat to Axes

3. Matrix4 class

注意,OpenGL在多种变换同时施加到顶点上时以相反的顺序矩阵相乘。例如,假如一个顶点先以MA

 x 


 

 

投影矩阵Projection Matrix(GL_PROJECTION)

GL_PROJECTION矩阵用来定义截锥体。该截锥体决定了那些对象或者对象的哪些部分将会被裁剪掉。同样,它也决定着3D场景怎样投影到屏幕中

(关于怎样构建投影矩阵,请查看

http://www.songho.ca/opengl/gl_projectionmatrix.html

 

OpenGL提供2个函数用来GL_PROJECTION变换。glFrustum()产生投影视角。glOrtho()产生正交(或者平行)投影。

两个函数都需要6个参数决定6个剪切面:left, right, bottom, top, near, 和far 平面。截锥体的8个顶点如下所示:

OpenGL Perspective Frustum 
OpenGL Perspective Viewing Frustum

 

远端平面(后面)的顶点能够简单地通过相似三角形的比率计算出来。例如,远端平面的左侧可以如下计算:


 

对于正交投影,ratio为1,所以远端平面的left,right,bottom和top值都与近端平面的值相同。

 

同样,你也可以使用gluPerspective()和gluOrtho2D()函数,但是传递更少的参数。gluPerspective()只需要4个参数:视图的垂直区域(vertical field of view(FOV)),

width/height的ratio,还有近端平面和远端平面的距离。下面代码使用gluPerspective()和glFrustum()实现同样的功能:


 

OpenGL正交的截锥体

OpenGL Orthographic Frustum 
OpenGL Orthographic Frustum

 

然而,假如你想要一个非对称的视觉空间,你可以直接使用glFrustum()。例如,

假如你想要呈现一个大的场景到2个相邻的屏幕,你可以截断截锥体变成2个不对称的截锥体(左和右)。然后,

呈现每个截锥体场景。

(这句话太不好翻译了,原位如下:

For example, if you want to render a wide scene into 2 adjoining screens, you can break down the frustum into 2 asymmetric frustums (left and right). Then, render the scene with each frustum.

 

 
An example of an asymmetric frustum

 

纹理矩阵(GL_TEXTURE)

纹理坐标(s,t,r,q)在任何纹理映射之前乘以GL_TEXTURE矩阵所得,默认是恒等的。所以纹理映射到物体的位置将正好是你赋值给纹理坐标的位置。

通过改变GL_TEXTURE,你可以滑动,旋转,拉伸或者伸缩纹理。


 

颜色矩阵(GL_COLOR)

颜色部分是通过乘以GL_COLOR矩阵所得。该矩阵用于颜色空间和颜色组件的变换。(原位如下:It can be used for color space conversion and color component swaping)

颜色矩阵并不是通用的,需要GL_ARB_imaging扩展(什么是GL_ARB_imaging扩展?求解)

 

其他矩阵例子

glPushMatrix()——将当前的矩阵压入矩阵栈

glPopMatrix()——从当前的矩阵栈中弹出当前的矩阵

glLoadIdentity()——设置当前矩阵为等同矩阵

glLoadMatrix{fd}(m)——将当前矩阵替换成矩阵m

glLoadTransposeMatrix{fd}(m)——将当前矩阵换成其转置矩阵

glMultMatrix{fd}(m)——将当前矩阵乘以矩阵m,并且更新当前矩阵

glMultTransposeMatrix{fd}(m)——将当前矩阵乘以其转置矩阵,并且更新当前矩阵

glGetFloatv(GL_MODELVIEW_MATRIX, m) ——将GL_MODELVIEW矩阵的16个值加载到m中

 

例子1:ModelView Matrix


 

这个demo应用显示怎样使用glTranslatef()和glRotatef()操作GL_MODELVIEW

下载链接:

matrixModelView.zip:   

http://www.songho.ca/opengl/files/matrixModelView.zip

 

(OS X 10.6+) matrixModelView_mac.zip:   http://www.songho.ca/opengl/files/matrixModelView_mac.zip

注意所有的OpenGL函数在Mac和Windows下都在ModelGL.h和ModelGL.cpp中实现,在这些包中的这些文件是完全一样的。

 

该demo应用使用一个定制的4X4类(链接为:http://www.songho.ca/opengl/gl_matrix.html)作为默认的OpenGL矩阵例子,为了指定model和camera变换.

在ModelGL.cpp中有3中矩阵对象:matrixModel,matrixView和matrixModelView.每一种矩阵保存着预先计算好的变换。然后将这些矩阵元素传递给OpenGL的函数——glLoadMatrix().实际的画图程序应该向下面这个样子:

 

使用OpenGL默认的矩阵函数,相同的代码如下:

 

投影矩阵例子:

 

该 demo应用显示了如何使用glFrustum()和glOrtho()函数操作投影变换。

源码和二进制文件下载的链接:

matrixProjection.zip:   

http://www.songho.ca/opengl/files/matrixProjection.zip

 

matrixProjection_mac.zip(OS X 10.6+):   

http://www.songho.ca/opengl/files/matrixProjection_mac.zip

 

同样,ModelGL.h和ModelGL.cpp在两者的包中有同样的文件,且所有的OpenGL函数都置于这些文件中。

 

ModelGL类有一个定制的matrix对象:matrixProjection,两个成员函数:setFrustum()和setOrthoFrustum().

其功能与glFrustum()和glOrtho()函数相同

 

GL_PROJECTION矩阵构建的16个参数在这可以看到:



http://www.songho.ca/opengl/gl_projectionmatrix.html

 

转自:http://blog.csdn.net/lyx2007825/article/details/8792475

分享到:
评论

相关推荐

    【OpenGL】二十、OpenGL 矩阵变换 ( 矩阵缩放变换 矩阵旋转变换 矩阵平移变换 ).zip

    【OpenGL】二十、OpenGL 矩阵变换 ( 矩阵缩放变换 | 矩阵旋转变换 | 矩阵平移变换 ) https://hanshuliang.blog.csdn.net/article/details/112859256 博客源码 ( 该源码是 Windows 桌面程序 , 使用 Visual Studio ...

    一个简单的OpenGL矩阵变换和纹理应用的小demo

    在这个"一个简单的OpenGL矩阵变换和纹理应用的小demo"中,开发者利用了多个关键的第三方库来实现其功能。下面我们将深入探讨这些库以及它们在OpenGL编程中的作用。 1. **glfw**:这是一个轻量级的窗口管理和输入库...

    opengl 矩阵变换

    OpenGL中的矩阵变换是3D图形编程中的核心概念,它涉及到物体坐标系与世界坐标系之间的转换,以及平移、旋转和缩放等操作。在理解这些变换时,我们需要明确几个关键点: 首先,物体(Object)坐标系是建模工具(如3...

    openGL 各种坐标矩阵变换

    "OpenGL 坐标矩阵变换" OpenGL 坐标矩阵变换是指在 OpenGL 中对三维空间中的物体进行各种变换,包括模型变换、视图变换、投影变换和剪裁变换。这些变换都是通过矩阵乘法来实现的。 模型变换是指对物体本身的变换,...

    实验五_(源程序2).rar_OPenGl实现_opengl模型_opengl矩阵_physicale1d

    1. **OpenGL矩阵变换**: 在OpenGL中,矩阵变换是通过数学矩阵来完成的,包括平移、旋转、缩放等操作。这些变换通常被封装在`glMatrix`库中,如`glm`,它提供了易于使用的API来进行矩阵运算。在源程序中,你可以...

    【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 渲染前不设置单位阵 压栈出栈原理分析 代码示例 ).zip

    【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 ) https://hanshuliang.blog.csdn.net/article/details/112917092 博客源码 ( 该源码是...

    opengl.rar_OpenGl 透视变换_opengl矩阵_模型变换_透视变换_键盘 opengl

    OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。...同时,理解和使用OpenGL矩阵是理解其工作原理的关键,因为几乎所有的图形操作都可以归结为矩阵运算。

    OpenGLES demo - 9. 矩阵变换

    在OpenGLES编程中,矩阵变换是至关重要的一个概念,特别是在3D图形渲染中。本教程将深入探讨OpenGLES中的矩阵变换,并通过一个实际的示例代码来演示其工作原理。OpenGLES是一个用于在iOS设备上进行2D和3D图形渲染的...

    OpenGL图形变换的实现

    在OpenGL编程中,这些变换通过矩阵运算来完成,为图形提供了丰富的视觉效果。以下是对这个主题的详细阐述: 一、OpenGL简介 OpenGL(Open Graphics Library)是一种跨语言、跨平台的应用程序编程接口(API),用于...

    OpenGL透视变换详解

    在OpenGL中,透视变换是构建真实感图像的关键部分,它模仿人眼观看三维世界的方式,使得远离观察者的物体看起来更小,靠近观察者的物体看起来更大,从而产生深度感。本文将详细解析OpenGL中的透视变换,特别是`...

    利用VC++和openGL实现魔方

    4. OpenGL矩阵变换实现旋转 5. 主循环与渲染过程 6. 键盘事件处理与动态交互 通过这个项目,你可以深入了解OpenGL的基础知识,同时提高C++编程和3D图形编程的技能。无论是对游戏开发还是其他3D应用,这都将是一次...

    OpenGL模型变换和视图变换

    ### OpenGL模型变换和视图变换 #### 模型变换 在计算机图形学中,特别是使用OpenGL进行三维渲染时,模型变换是一种重要的操作,用于改变场景中对象的位置、大小和方向。OpenGL提供了几个基本函数来执行这些变换:...

    OpenGL图形变换编程实例

    在OpenGL中,我们通常使用4x4的齐次坐标矩阵,这种矩阵不仅可以处理常规的3D变换,还可以方便地实现投影变换。 平移变换是图形沿X、Y、Z轴移动的基础操作。在OpenGL中,可以通过调用glTranslatef函数实现。这个函数...

    Qt OpenGL 缩放矩阵,旋转矩阵 移动矩阵.mat4x4

    在这个项目中,"Qt OpenGL 缩放矩阵,旋转矩阵 移动矩阵.mat4x4",重点在于理解并应用线性代数中的矩阵变换,特别是缩放、旋转和移动(平移)这三种基本变换。这些变换在3D图形编程中至关重要,因为它们帮助我们在三...

    OpenGL教程几何变换

    在OpenGL中,这些变换通常通过矩阵运算来实现,因为矩阵可以简洁且高效地表示和组合多个变换。 1. 平移(Translation):平移变换允许我们将物体沿着X、Y或Z轴移动。在OpenGL中,这通常通过一个4x4的平移矩阵完成,...

    jiqiren.zip_opengl矩阵_机器人矩阵

    1. **OpenGL矩阵栈**:OpenGL提供了两个预定义的矩阵栈——模型视图矩阵栈和投影矩阵栈。模型视图矩阵用于处理物体在场景中的位置和方向,而投影矩阵则负责将3D空间的几何体映射到2D屏幕上。 2. **基本矩阵操作**:...

    opengl 视点变换

    在OpenGL中,我们可以通过设置模型观察矩阵(Modelview Matrix)来定义视点。默认情况下,观察者位于(0, 0, 0)点,看向Z轴负方向,即屏幕内部。 2. **定义目标点(Look At)**:这是观察者所看的方向。例如,我们...

    OpenGL ES相关的矩阵和变换(附实例代码)

    这涉及到更复杂的矩阵变换,如投影矩阵和视口变换,通常通过glFrustum()、glOrtho()或gluPerspective()等函数来设置。在大多数情况下,开发者不需要直接处理透视变换,除非有特殊需求。 矩阵运算在OpenGL ES中起着...

    OpenGL完全教程第四章矩阵变换[定义].pdf

    OpenGL完全教程第四章深入探讨了3D图形编程中的核心概念——矩阵变换。矩阵变换是OpenGL中实现几何对象平移、旋转、缩放等操作的基础。本章内容涵盖了变换的种类,如何使用矩阵来描述变换,以及OpenGL中的四种主要...

    opengl矩阵堆栈的使用(动态齿轮)

    总之,OpenGL中的矩阵堆栈是实现复杂图形变换的关键工具,动态齿轮示例是一个很好的练习平台,通过实际操作可以深化对矩阵变换、模型视图矩阵和投影矩阵的理解。结合清晰的源代码注释,这个过程将变得更为直观和易懂...

Global site tag (gtag.js) - Google Analytics