OpenGL学习笔记(5)3D基本概念

来源:互联网 发布:c语言type buffer 编辑:程序博客网 时间:2024/05/17 03:28

 


这次介绍的都是一些比较枯燥的概念.在现实生活中都非常真实,为了避免枯燥,我们还是讲点大家都经历过的事情

视图变换


拍照:

  1. 第一步先选景(模型)
  2. 选好景之后你就需要挑一个好的位置(视图)来拍
  3. 挑好位置以后拿起你的照相机对准景物

接下来针对不同的景,你会做出不同的动作

比如拍杭州西湖:那么你会横放你的照相机进行全景拍摄

但是换做拍雷峰塔的,你想拍全景的就必须把照相机竖起来 
比如你的头可以左右移动,也可以上下移动 

以上讲的就是视图变换,即模型(参照物)位置不变,但视图在发生变化.

模型变换

假设现在不拍景色,而是拍人,即参照物可以移动变化.但视图没有变化

即这时照相机的位置,拍摄的角度都已经固定了. 
但可能会让模型(人)发生一些变化 
比如位置的移动(包括左右,上下,前后) 
缩放(人是无法缩放的微笑,所以其可能做的动作是蹲下,站在一个假山上使得自己更高(也不会飞))

旋转(大部分人只会左右旋转,艺术家则会翻跟斗),所以这时候你应该拿一块大的橡皮泥来做参照物微笑

下面还是来看代码吧

#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 (1.0, 1.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);   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);   }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);   glutMainLoop();   return 0;}

以下是效果 
image

矩阵相乘

当设置对象矩阵时,会把当前矩阵(可能是OpenGL内部一个全局的变量)与当前的矩阵相乘,为了清除这个变量,需要先调用glLoadIdentity 方法,当然在组合变换的时候则不需要此方法.但当参照物发生变化时,则需要调用此方法

选择矩阵模式

glMatrixMode方法用于修改的是选择模型视图矩阵还是投影矩阵

设置视图变换

gluLookAt 方法方便的设置了视图需要的一些参数 
image

这里的模型则是使用glutWireCube 画了一个立方体

请下载http://www.xmission.com/~nate/tutors.html此处的示例教程,改变参数来理解视图变换和模型变换

image

0 0
原创粉丝点击