OpenGl And 视图
OpenGl And 视图
标签(空格分隔): game
简介
本文主要介绍坐标系的观念, 以及在openGL中的视图及其相关的变换。
大纲
- 视图、模型、投影变换概念
- Opengl中对各种变换的支持
视图变换
在一个三维坐标系中, 一个模型的展示并不只有一个视图就可以了。而是存在视图变换,投影变换,模型变换的过程。
顶点坐标---》(模型视图矩阵)----》视觉坐标---》(投影矩阵)----》裁剪坐标----》(透视坐标)----》规范化设备坐标----》视口变换----》窗口坐标
在opengl中主要通过以下三种变换达到最终控制屏幕输出:
- 视图变换: 视图是指摄像机能看到到区域,所以视图变换就是移动摄像机使其说能展示的区域发生变换
- 模型变换:是场景中的模型动起来,主要是针对模型的
- 投影变换: 决定了模型最终能在屏幕中的现实, 比如通过投影变换, 可以只让模型只显示一半。
为了进行视图,模型,投影变换, 可以创建一个4*4的矩阵M然后让他与顶点对应的坐标v相乘,以实现变换:
$$v' = Mv$$
OpenGl 中对视图、模型、投影变换的支持
gult库
gl库只是一个图形库, 在我们写的窗口程序的过程中,我必须写窗口程序已经消息处理,我们可以自己写 ,当然也可以用gult库。glut库中的api都已glut开头,最典型的现实一个窗口如下:
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
代码很简单,而我们要关注的是三个函数:
- diplay 模型的展示, 内部主要做模型变换
- reshage 视口的控制, 主要做视图和投影变换
- keyboard 对键盘输入的支持
引出
我们可以用如下代码创建一个球体
void PlanteDisplay::excute()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
drawSun();
}
void PlanteDisplay::drawSun()
{
glutWireSphere(1.0, 20, 16); /* draw sun */
glutSwapBuffers();
}
我们可以加上一些初始化的动作
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
我们会发现有如下所示的球体:
我们创见好了物体, 但是还没有设置好摄像机,opengl默认情况下回把摄像机正对着屏幕,而摄像机的镜头设置就在reshage中实现,在该函数中, 我们主要控制视图变换和投影变换。
视口变换
视口变换决定了场景所映射的有效屏幕区域的形状。利用函数glViewport来实现。
最简单的变换如下:
void cubeReshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
}
我们改变屏幕的裁剪区域(投影变换):
glViewport(50, 0, (GLsizei)w/2, (GLsizei)h/2)
会发现如下图显示:
模型变换
调用变换函数之前,需要确定自己想修改的模型视图矩阵还是投影视图矩阵,可以用glMatrixMode() 选择矩阵,并用glLoadIdentity() 把当前可修改矩阵清除为单位矩阵。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
在OpenGl中,有三个函数用于执行模型变换:
- glTranslate*()
- glRotate*()
- glScale*()
如:
glTranslatef(0.2, .2, 0);
glScalef(1.5, 2.0, 1);
glutWireSphere(0.4, 50, 8);
视图变换
视图 变换拥有膝盖观察点的位置和方向。可以由两种方法来实现:
- 反方向移动物体
- 使用gluLookAt()函数
正常如图所示:
gluLookAt(0.0, 0.0, 0.0
, 0.0, 0.0, -1.0
, -1.0, -1.0, 0.0);
gluLookAt(0.0, 0.0, 0.0
, 0.0, 0.0, -1.0
, 0.0, -1.0, 0.0);
投影变换
投影变换最终控制线上屏幕的裁剪区域, opengl中可以用:
- glOrtho
- glFrustum
来进行投影变换。
glOrtho 和 glFrustum 的区别
- glOrtho:创建一个正交平行的视景体。 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。比如,常用的工程中的制图等。需要比较精确的显示
- glFrustum 产生一个透视投影。这是一种模拟真是生活中,人们视野观测物体的真实情况。例如:观察两条平行的火车到,在过了很远之后,这两条铁轨是会相交于一处的。还有,离眼睛近的物体看起来大一些,远的物体看起来小一些。
glFrustum(GLdouble left
, GLdouble right
, GLdouble bottom
, GLdouble top
, GLdouble near
, GLdouble far)
其中: (left, botton, -near)表示近侧裁剪平面左上角的坐标,(right, top, -near)表示右下角坐标,near和far分别表示观察点到近侧和远侧的距离。
OpenGl And 视图的更多相关文章
- VC++环境下单文档SDI与OpenGL多视图分割窗口的实现-类似3DMAX的主界面
本文主要讲述如何在VC++环境下实现单文档SDI与OpenGL多视图分割窗口,最终的界面类似3DMAX的主界面.首先给出我实现的效果图: 整个实现过程网络上有很多零散的博文,请各位自行搜索,在基于对话 ...
- [转]浮动窗体中的OpenGL多视图的实现
由于在工作中需要结合浮动窗体实现OpenGL的多视图,用于得到三维实体的三视图观察效果,通过参考其它资料,设计了一个程序框架,在此基础之上大家可以根据自己的需要进行扩充,实现需要的功能. 程序实现效果 ...
- OpenGL 多视图与截屏
最近看红宝书学习 OpenGL 一段时间了,写了简单的 demo 程序温习一下知识. 主要是 使用 glScissor 多视图显示画面和使用 glReadPixels 给画面截屏,使用显示列表(dis ...
- OpenGL的视图变换、模型变换、投影变换、视口变换
产生目标场景的过程类似于用照相机进行拍照: (1) 把照相机固定在三角架上,并让他对准场景从不同位置观察场景(视图变换) gluLookAt (2) 对场景进行安排,使各个物体在照片中的位置是我们所希 ...
- 简单理解OpenGL模型视图变换
前几天学习了OpenGL的绘图原理(其实就是坐标的不停变换变换),看到网上有个比较好的例程,于是学习了下,并在自己感兴趣的部分做了注释. 首先通过glMatrixMode(GL_MODELVIEW)设 ...
- OpenGL模型视图变换、投影变换、视口变换的理解
OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕向外). 产生目标场景的过程类似于用照相机进行拍照: (1)把照相机固定在三角架上,并让他对 ...
- OpenGL 模型视图投影矩阵 仿射矩阵
矩阵基础知识 要对矩阵进行运算,必须先要了解矩阵的计算公式,这个知识的内容涉及到了线性代数. 我们知道在Cocos2dx中,有关于平移,旋转,缩放等等操作,都必须要进行矩阵的乘法. 只需要一张图就能理 ...
- 视图矩阵的推导-opengl应用
把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵. 下面我们先看下opengl视图矩阵的推导过程: 假设视点或camera的局部坐标系为UVN,UVN分别指向右方.上方和后方从而构成右手坐标系,视 ...
- OpenGL阴影,Shadow Mapping(附源程序)
实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...
随机推荐
- 修改Wordpress目录
安装完wordpress,此时访问地址为:http://localhost/wordpress 1.不想让人知道我的文件目录,于是我把原来的wordpress改为w, 2.后台设置 3.WordPre ...
- 行高不设单位的好处 line-height:1.8
今天无意间看了到了line-height:1.8 感觉挺有意思的,然后翻了下行高的知识,发现还挺有文章的,不妨温故而知新. 先回顾下:顶线.中线.基线.底线 vertical-align是元素的垂直对 ...
- 通过定位position="fixed"实现网页内容的固定层效果
在网页的顶部或者底部导航栏中经常需要使用到固定层的效果,即紧挨浏览器窗口的顶部或底部而网页其他内容的影响. 一.实现 主要通过设置导航栏元素的位置属性position="fixed" ...
- SQL PROMPT 取消dbo前缀
SQL Prompt 无疑大大提高了开发者的效率,高效而简单,特别适合大型的数据库脚本编写,但遗憾得是至今没有可供使用的中文版本.SQL Prompt 默认对象名前面会有 dbo 前缀,在一些场合这样 ...
- Java学习-007-Log4J 日志记录配置文件详解及实例源代码
此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...
- apache 根据端口访问配置
1. http.conf 中 需要加上 listen 8080 然后 开启 Include conf/extra/httpd-vhosts.conf http.conf 是项目的主配置文件 ,引 ...
- form和validate示例
//验证from表单 $(function () { $("#addUserForm").validate({ rules: { txtName: { required: true ...
- javascript:void(0)和javascript:;的用法
一.JavaScript:void(0) 我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢 ...
- 5、JavaScript进阶篇②——函数、事件、内置对象
一.函数 1. 什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. 如:我们要完成多组数和的功能. var sum; sum = 3+2; alert(sum); sum=7+8 ; a ...
- MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)
ON DUPLICATE KEY UPDATE 博客 http://blog.csdn.net/jbboy/article/details/46828917