关于OpenGL中模型视图投影视口变换的理解
来源:互联网 发布:seo的效果 编辑:程序博客网 时间:2024/06/06 20:08
还是对于OpenGL中的各种变换理解的有些模糊,从网上看到了好多解释,现总结一下。
变换种类有:模型变换,视图变换,投影变换,视口变换
以下的内容以红宝书中的cube.c程序作为讨论对象。
程序代码:
#include <GL/glut.h>
#include <stdlib.h>
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glLoadIdentity (); /* clear the matrix */
/* viewing transformation */
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glScalef (1.0, 2.0, 1.0); /* modeling transformation */
glutWireCube (1.0);
glFlush ();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
glMatrixMode (GL_MODELVIEW);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
先说明一下各种变换在代码中出现的顺序:
在代码中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换。
注意事项:
1.display()程序中绘图函数潜在的重复性强调了:在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵。
2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换。如果程序没有调用gluLookAt(),那么照相机会设定为一个默认的位置和方向。在默认的情况下,照相机位于原点,指向Z轴负方向,朝上向量为(0,1,0)。
3.一般而言,display()函数包括:视图变换 + 模型变换 + 绘制图形的函数(如glutWireCube())。display()会在窗口被移动或者原来先遮住这个窗口的东西被一开时,被重复调用,并经过适当变换,保证绘制的图形是按照希望的方式进行绘制。
4.在调用glFrustum()设置投影变换之前,在reshape()函数中有一些准备工作:视口变换 + 投影变换 + 模型视图变换。由于投影变换,视口变换共同决定了场景是如何映射到计算机的屏幕上的,而且它们都与屏幕的宽度,高度密切相关,因此应该放在reshape()中。reshape()会在窗口初次创建,移动或改变时被调用。
OpenGL中矩阵坐标之间的关系
物理坐标*模型视图矩阵*投影矩阵*透视除法*规范化设备坐标——〉窗口坐标
(1)视图变换函数gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0,)设置照相机的位置
把照相机放在(0,0,5),镜头瞄准(0,0,0),朝上向量定为(0,1,0)朝上向量为照相机指定了一个唯一的方向。如果没有调用gluLookAt,照相机就设定一个默认的位置和方向,在默认情况下,照相机位于原点,指向Z轴的负方向,朝上向量为(0,1,0)
glLoadIdentity()函数把当前矩阵设置为单位矩阵。
(2)使用模型变换的目的是设置模型的位置和方向
(3)投影变换,指定投影变换类似于为照相机选择镜头,可以认为这种变换的目的是确定视野,并因此确定哪些物体位于视野之内以及他们能够被看到的程度。
除了考虑视野之外,投影变换确定物体如何投影到屏幕上,OpenGL提供了两种基本类型的投影,1、透视投影:远大近小;2、正投影:不影响相对大小,一般用于建筑和CAD应用程序中
(4)视口变换
视口变换指定一个图象在屏幕上所占的区域
(5)绘制场景
- 关于OpenGL中模型视图投影视口变换的理解
- OpenGL中glMatrixMode()函数以及视图变换,模型变换,投影变换,视口变换的理解
- 视图、模型、投影、视口变换
- opengl 关于 投影变换,模型视图变换,视口变换 和多视口 的综合例子
- 关于模型视图变换的一些理解
- OpenGL 入门教程 模型视图投影矩阵 变换光线
- 理解OpenGL中的模型视图矩阵变换
- 理解OpenGL中的模型视图矩阵变换
- 理解OpenGL中的模型视图矩阵变换
- OpenGL模型视图变换,投影变换及视口变换
- OpenGL模型视图变换、投影变换、视口变换
- OpenGL模型视图变换、投影变换、视口变换
- OpenGL模型视图变换、投影变换、视口变换
- OpenGL模型视图变换、投影变换、视口变换
- OpenGL 模型视图变换、投影变换、视口变换
- OpenGL模型视图变换、投影变换、视口变换
- OpenGL模型视图变换、投影变换、视口变换总结
- OpenGL中剪裁平面与模型视图变换的关系
- GRE数学词汇扩展版
- 02-07GRE真题及答案解析整理
- 杨鹏《十七天搞定GRE单词》
- ETS官方Argument主题范文36篇
- 自己很不满意的result
- 关于OpenGL中模型视图投影视口变换的理解
- 帮助理解OpenGL某些概念的截图
- linux下 cvs 配置
- VS2005 保存文件、向导生成代码 速度变慢的解决方案
- Mobius Forensic Toolkit
- Facebook 到底有多大?
- JAVA测试题发布几天的答题情况总结
- Windows 驱动的概念
- Spring 的基本设计思想