OpenGL中各种坐标系的理解

OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。

 

世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对

           屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:

           窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角

           坐标为(1,1)。

 

当前绘图坐标系:是绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合

           的。当用glTranslatef(),glScalef(), glRotatef()等对当前绘图坐标系进行平移、

           伸缩、旋转变换之后,世界坐标系和当前绘图坐标系不再重合。注意,这里的平移旋

           转是将当前绘图坐标系看做一个整体在世界坐标系中进行旋转平移。然后,改变以

           后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的

           函数参数也都是相对当前绘图坐标系来讲的。

今天看3D模型动画代码中,发现用四元组来进行插值和旋转,了解了使用欧拉角做旋转会有万向锁的问题存在。但这个是建立在对模型坐标系进行旋转的基础上,于是又对OGL中矩阵变化的部分再次学习了一下。发现了一篇好文章,转发学习,留供查阅。

 

 

openGL使用右手坐标

从左到右,x递增
从下到上,y递增
从远到近,z递增


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

 

OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。

世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)(1,1)

当前绘图坐标系 绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef()glScalef(), glRotatef()对当前绘图坐标系进行平移、伸缩、旋转变换之后, 世界坐标系和当前绘图坐标系不再重合。改变以后,再用glVertex3f()绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是对当前绘图坐标系来讲的

 


 

OpenGL中的6种坐标系

OpenGL中存在6种坐标系,

1. Object or model coordinates

2. World coordinates

3. Eye (or Camera) coordinates

4. Clip coordinates

5. Normalized device coordinates

6. Window (or screen) coordinates

object coordainatesworld coordinates再到camera coordinate的变换,在OPENGL中统一称为model-view转换,初始化的时候,object coordinatesworld coordinates还有camera coordinates坐标重合在原点,变换矩阵都为Identitymodel-view matix转换points,vectorsdcamera坐标系。

 

opengl编程中,有个困惑的问题,就是那个坐标系是不动的,我想是你想参考坐标系是不动的。比如我想建立了一个object,放到 camera坐标系中,这时,我以camera的原点为参考点。当然,我想看这个物体的时候,我就以object的原点为参考点,移动camera坐标系的原点,就可以看到object了。好像写了一堆废话,呵呵。

 

 

其中四种坐标经常要在程序中用到:世界坐标,物体坐标,设备坐标和眼坐标

 

世界坐标OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。

将物体放到场景中也就是将物体平移到特定位置、旋转一定角度,这些操作就是坐标变换。OpenGL中提供了glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。

 

非常重要:OpenGL中有一个坐标变换矩阵栈(ModelView)栈顶就是当前坐标变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。OpenGL中的坐标变换都是通过矩阵运算完成的,与图形学课本的描述完全一致。要注意的是变换中的矩阵乘法是左乘,而矩阵乘法与算术乘法不同,不符合交换律(万一不明白去看矩阵代数书好了)

 

glTranslate*(x,y,z):平移,参数为各轴向的移动量。
glRotate(d,x,y,z)
:旋转,第一个参数为转动的度数,后三个参数表明是否绕该轴旋转。通常x,y,z中只有一个为1,其余为0,用连续几条旋转命令完成复杂旋转。由于矩阵运算的左乘特点,旋转命令的顺序与旋转动作的顺序正好相反

 

物体坐标是以物体某一点为原点而建立的世界坐标该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。

 

眼坐标是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。

 

同样的,有投影变换矩阵栈(Projection),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标。前面提到过的视见体设定其实就是在建立该矩阵。

 

设备坐标:OpenGL 的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。值得一提的是,OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区或视口(viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。

 

矩阵栈切换:glMatrixMode(GL_MODELVIEWINGGL_PROJECTION);本命令执行后参数所指矩阵栈就成为当前矩阵栈,以后的矩阵栈操纵命令将作用于它。

 

矩阵栈操纵命令:
glPushMatrix(); 当前矩阵入栈,这时矩阵栈将栈顶值压入栈。
glPopMatrix(); 栈顶出栈,通常与上一条命令配合使用。
glLoadIdentity(); 将栈顶设为不变矩阵(就是对角线全为1其它为0的那个)
glMultMatrix(M);将栈顶T设为M·T

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

默认手机照相功能

下面是主要代码: - (void) addPicEvent { //先设定sourceType为相机,然后判断相机是否可用(ipod)没相机,不可用将sourceType设定为相片库 UIImagePickerControllerSourceType sourceType UIImagePickerControllerSourceT…

qmake生成vs2013工程文件

qmake -spec win32-msvc2013 -r -tp vc xxx.pro

iOS面试题

今天上午,下午分别面试了两家公司。上午是一家互联网公司,气氛还比较好,是我比较喜欢的。技术这块是直接机试,主要是给了些BUG让我修复,整个过程还算顺利。下午去了一家大型的证券公司。整理技术问题如下: …

Prepar3d.cfg

如果设置为0,打开p3d直接进入默认场景 [USERINTERFACE] SHOW_SCENARIO_WINDOW1

mysql严格模式 报错_mysql严格模式

mysql严格模式严格模式例子1234567DB::table(table_name)->where(status, 1)->select(DB::raw(sum(score) as num,user_id,channel))->groupBy(user_id)->orderBy(num, desc)->limit(10)->get();会报错:Syntax error or access violation: 1055 E…

Android Service 的一些笔记

绑定服务: 用于间接调用服务里面的方法。如果调用者Activity被销毁了,服务也跟着销毁了,服务也会跟着销毁。 开启服务: 不可以调用服务里面的方法。如果调用者的Activity退出了,服务还会长期在后台运行 生命周期 ①单独…

python traceback 丢失_基于python traceback实现异常的获取与处理

这篇文章主要介绍了基于python traceback实现异常的获取与处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1、traceback.print_exc()2、traceback.format_exc()3、traceback.print_exception()简单说下这三个…

用Javascript获取页面元素的位置

制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置。 下面的教程总结了Javascript在网页定位方面的相关知识。 一、网页的大小和浏览器窗口的大小 首先,要明确两个基本概念。 一张网页的全部面积,就是它的大小。通常情况下&#…

[Qt] 利用QtWebKit完成JavaScript访问C++对象

http://blog.csdn.net/longsir_area/article/details/42965565 一. 介绍 在浏览器扩展或者WebApp的项目经常用的脚本语言JavaScript有很多局限性,比如,javascript语言不能够夸窗口访问js对象,不能直接读写磁盘文件(这个…

lua cURL使用笔记

cURL cURL是 URL命令行工具, 即 command URL, 可以通过命令行模拟各种应用协议的发包, 包括FTP HTTP HTTPS, 官方网站 http://curl.haxx.se/ luacurl lua curl是基于curl的库libcurl(http://curl.haxx.se/libcurl/&…

mysql三大范式_MySQL学习笔记

1、数据库结构设计1、总-总体流程图2、分-【提取属性】业务分析评价的属性:{用户,课程主标题,内容,综合评分,内容实用,简洁易懂,逻辑分析,发布时间} 问答评论属性:{类型,…

QT webkit 各个类之间关系--QWebView-QWebPag

一、QT webkit简介 1.Qt Qt(发音同 cute)是一个跨平台的C应用程式开发框架,有时又被称为C部件工具箱。Qt被用在KDE桌面环境、Opera、Google Earth、Skype、Adobe Photoshop Album和VirtualBox的开发中。它是挪威Qt Software 的产品&#xff0…

baidu patchrom项目开发详细教程(Being updated)

linux64位android开发环境 baidu patchrom项目开发 by: doswhy [百度云ROM官方项目组修订] by: colinchen 学习修改 ****************************************************************************************************************************************************…

vue 文件转换二进制_在vue中使用axios实现post方式获取二进制流下载文件(实例代码)...

需求点击导出下载表格对应的excel文件在 vue 项目中,使用的 axios ,后台 java 提供的 post 接口 api实现第一步,在 axios 请求中加入参数,表示接收的数据为二进制文件流responseType: "blob"第二步,在拿到数据流之后,把流转为指定文件格式并创建a标签,模拟点击下载,实…

QMainWindow中的布局管理

给QWidget或者QDialog设置布局的时候方式很简单。创建好一个布局:mainLayout,然后不停地把各个控件往mainLayout里面放,最后调用setLayout(mainLayout)就行了。 QMainWindow中使用这个方法的时候却不管用,因为QMainWindow是默认有…

ubuntu下vim语法高亮问题

造成语法不能高亮的原因,是ubuntu上的vi和vim默认是vim.tiny,tiny是精简版,不支持语法高亮,需要安装完整版vim,即vim.basic。 在shell栏输入下面指令: xiaubuntu:~$sudo apt-get install vim 转载于:https:…

autoincrement mysql_SQL AUTO INCREMENT 字段 | 菜鸟教程

SQL AUTO INCREMENT 字段Auto-increment 会在新记录插入表中时生成一个唯一的数字。AUTO INCREMENT 字段我们通常希望在每次插入新记录时,自动地创建主键字段的值。我们可以在表中创建一个 auto-increment 字段。用于 MySQL 的语法下面的 SQL 语句把 "Persons&…

vs2010中moc文件生成方法

Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同…

LFS,编译自己的Linux系统 - 前言

LFS,编译自己的Linux系统 - 前言 近期工作计划:1. 上班时,用Django编写一个网站;2. 下班时,用C#、WPF编写一个单机版应用软件;3. 其他时间,根据LFS编译自己的Linux系统。 LFS是一本书&#xff0…

mysql allowmultiqueries=true_Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新(转)...

实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就遇到这样的一个坑。问题先…