openGL坐标系

从我们构造模型的局部坐标系(Local/Object Space)经过一系列的处理最终渲染到屏幕坐标系(Screen Space)下,这个过程有6种坐标系。

一、世界坐标系(World Coordinates)

学名:右手笛卡尔坐标系统。

在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。x轴正方向为屏幕从左向右,y轴正方向为屏幕从下向上,z轴正方向为屏幕从里向外。长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角 坐标为(1,1)。

进行旋转操作时需要指定的角度θ的方向则由右手法则来决定,即右手握拳,大拇指直向某个坐标轴的正方向,那么其余四指指向的方向即为该坐标轴上的θ角的正方向(即θ角增加的方向),在上图中用圆弧形箭头标出。

坐标变换矩阵栈:

用来存储一系列的变换矩阵,栈顶就是当前坐标的变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。OpenGL中的坐标变换都是通过矩阵运算完成的。 
如图:

对象坐标系(乘以模型视图矩阵)--->眼睛坐标系(乘以投影矩阵)--->裁剪坐标系(除以w)--->标准设备坐标系--->设备坐标系

二、对象/模型/局部/绘图坐标系(object coordinate)

这是对象在被应用任何变换之前的初始位置和方向所在的坐标系,也就是当前绘图坐标系。该坐标系不是固定的,且仅对该对象适用。在默认情况下,该坐标系与世界坐标系重合。这里能用到的函数有glTranslatef(),glScalef(), glRotatef(),当用这些函数对当前绘图坐标系进行平移、伸缩、旋转变换之后, 世界坐标系和当前绘图坐标系不再重合。改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相对当前绘图坐标系来讲的。如图则是对物体进行变换后,对象坐标系与世界坐标系的相对位置。

三、眼/照相机坐标系(eye coordinate)

模型变换:对象坐标系-->世界坐标系

视图变换:世界坐标系-->眼睛坐标系

GL_MODELVIEW矩阵是模型变换和试图变换矩阵的组合(view*model),因为没有单独的模型变换和视图变化,所以使用GL_MODELVIEW矩阵可以使对象直接从对象坐标系转换到眼睛坐标系。

为什么要转换到眼睛坐标系?

因为我们的观察位置没定,如果我们的眼睛(照相机)的位置不同,那么观察物体的角度则不同,看到的样子也不同,所有要有这一步,把场景与我们的观察位置对应起来。

默认情况下,眼睛坐标系与世界坐标系也是重合的。使用gluLookAt()则可以指定眼睛(相机)的位置和眼睛看的方向。该函数的原型如下:

1 void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,
2                         GLdouble centerx, GLdouble centery, GLdouble centerz,
3                         GLdouble upx, GLdouble upy, GLdouble upz);

函数参数中,点(eyex, eyey, eyez)代表眼睛所在位置;
点(centerx, centery,centerz)代表眼睛看向的位置;
向量(upx, upy, upz)代表视线向上方向,其中视点和物体的连线与视线向上方向要保持。

注:

使用glTranslatef(),glScalef(), glRotatef()这些函数是对对象坐标系进行变动;使用void gluLookAt()是对眼坐标系进行变动,两者可以达到相同的变换效果。相当于对象不动移动相机,和相机不动移动对象。比如场景向x轴正方向移动1个单位(相机不动),相当于相机向x轴负方向移动一个单位(对象不动),glTranslatef(1.0, 0.0, 0.0) <=> gluLookAt(-1.0, 0.0, 0.0, ..., ... )。

四、裁剪坐标系(clip coordinate)

眼坐标到裁剪坐标是通过投影完成的。眼坐标通过乘以GL_PROJECTION矩阵变成了裁剪坐标。

投影分为透视投影(perspective projection)和正交投影(orthographic projection)

1>透视投影

类似日常生活看到的场景,远大近小。透视投影函数有两个:gluPerspective()和glFrustum()

1 void glFrustum(GLdouble left, GLdouble right,
2       GLdouble bottom, GLdouble top,
3       GLdouble near, GLdouble far)
1 void gluPerspective(GLdouble fovy,  GLdouble aspect,
2           GLdouble near, GLdouble far) 

far, near是指近裁剪面,远剪裁面离视点的距离(>0),fovy视角,aspect = w/h

2>正投影

1 void glOrtho(GLdouble left, GLdouble right,
2            GLdouble bottom, GLdouble top,
3            GLdouble near, GLdouble far);

把物体直接映射到屏幕上,不影响它的相对大小。也就是图像反映物体的实际大小。

五、归一化设备坐标系(normalized device coordinate)

在裁剪坐标系下通过除以w分量得到,这个操作称为透视除法。得到的坐标值均为[-1,1]

六、屏幕坐标(screen coordinate)

屏幕坐标的x轴向右为正,y轴向下为正,坐标原点位于窗口的左上角。是归一化设备坐标系通过视口变换得到(viewport)

几何变换

OpenGL中可以使用的几何变换有平移、旋转、缩放三种。

glTranslatef(x, y, z);

该函数可以实现平移变换,x、y、z为各坐标轴上的平移量。

glRotatef(θ, x, y, z);

该函数实现旋转变换。θ为旋转角度,x、y、z为旋转轴。旋转方向由右手法则决定(参见第一节“坐标系”)。

glScalef(x, y, z);

该函数实现缩放变换。x、y、z为各轴方向的扩大量。若为负值,则沿着坐标轴的反方向进行缩放。

原文地址:https://www.cnblogs.com/keguniang/p/9886605.html

时间: 2024-10-19 13:17:53

openGL坐标系的相关文章

第五讲:OpenGL坐标系和UIKit坐标系、锚点、addChild函数详解

一.坐标系 OpenGl坐标系 原点在左下角(0,0),与数据的二维坐标系一致 UIKit坐标系 又称为屏幕坐标系,原点在左上角,X轴越右越大,Y轴越下越大: 由OpenGL转化为UIKit的方法: CCPoint point = CCDirector::sharedDirector()->convertToUI(sp1->getPosition); 二.锚点 锚点默认为(0.5,0.5) 就是在精灵的中间 : *****坐标系已锚点定位(先确定锚点在哪,ccp(X,Y)是描述锚点在哪个位置)

openGL 坐标系的互相转换

openGL坐标系包括旋转,平移,缩放被塞在一个矩阵里面. 坐标系之间的转换基础是矩阵的运算. 每个矩阵代表的坐标系,就是是原点坐标系通过旋转.平移,缩放得到的坐标系. 当一个矩阵右乘一个向量或是还有一个矩阵,意味着把右边的变换.变成相对于左边的矩阵坐标系之上. 假设把一个世界坐标的X转换到一个矩阵上,我们能够矩阵右乘这个坐标: static float multiplyMX(Matrix4* matrix, float x) { return matrix->m[0] * x + matrix

[OpenGL]OpenGL坐标系及坐标转换

OpenGL通过相机模拟.可以实现计算机图形学中最基本的三维变换,即几何变换(模型变换-视图变换(两者合称几何变换)).投影变换.裁剪变换.视口变换等,同时,OpenGL还实现了矩阵堆栈等.理解掌握了有关坐标变换的内容,就算真正走进了精彩地三维世界. 坐标系统 世界坐标系:在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标.为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一个坐标系.这个坐标系的长度单位

OpenGL坐标系介绍

OpenGL坐标系介绍 OpenGL可以分成四种坐标系,分别是世界坐标系,模型坐标系,眼坐标系,设备坐标系. 数学的观点:向量空间和仿射空间 仿射空间(affine space)是向量空间的扩展,除了标量和向量,它还包含另外一种对象-点. 尽管在仿射空间中对两个点以及一个点和一个标量没有定义运算,但对一个向量和一个点定义了一种运算--向量-点加法,它的结果是一个点.也可以说有一种称为点-点减法的运算,这种运算由两个点得到一个向量. 计算机科学的观点 把标量.点和向量看做是集合中的元素,并且可以按

OpenGL中各种坐标系的理解[转]

OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴.长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角 坐标为(1,1). 当前绘图坐标系:是绘制物体时的坐标系.程序刚初始化时,世界坐标系和当前绘图坐标系是重合 的.当用glTranslatef(),glScalef(),

OpenGl学习进程(7)第五课:点、边和图形(二)边

本节是OpenGL学习的第五个课时,下面介绍OpenGL边的相关知识: (1)边的概念: 数学上的直线没有宽度,但OpenGL的直线则是有宽度的.同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的.可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定.     (2)如何绘制边: 1)OpenGL支持绘制三种类型的边: GL_LINES :指定两个顶点,在它们之间绘制一条直线.如果为GL_LINES指定了奇数个顶点,那么最后一个顶点会被忽略. GL

Cocos2dx 小技巧(十三)聊聊坐标系

一好友考上了空姐,她说:以后基本上不会回来了,等下次见面时请叫我白富美!虽然有点羡慕,但我依旧不甘示弱回复:下次见面时请叫我高富帅!未来,谁说得准呢? ------------------有段时间没用到onTouchBegan,近来写代码时发现对convertToGL(),getLocation()这些接口都有点陌生了,所以趁这次机会就写个总结到博客里,下次忘了就来博客里看看,当笔记用咯. 首先脑补下基础知识吧:1.OpenGL坐标系:该坐标系原点在屏幕左下角,x轴向右,y轴向上.这也就是coc

Cocos2d-x 3.0坐标系详解(转载)

Cocos2d-x 3.0坐标系详解Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系.笛卡尔坐标系笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系.屏幕坐标系和Cocos2d坐标系标准屏幕坐标系使用和OpenGL不同的坐标系,而Cocos2d则使用和OpenGL相同的坐标系.iOS, Android, Windows Phone等在开发应用时使用的是标准屏幕坐标系,原点为屏幕左上角,x向右,y向下.Cocos2d坐标系和Ope

OpenGL中的深度、深度缓存、深度测试及保存成图片

1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联.      首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面).      然后,在场景中以任意次序绘制所有物体.硬件或者软件所执行的图形计算把每一个绘制表面