代码改变世界

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

2010-10-17 15:23  Clingingboy  阅读(2112)  评论(0编辑  收藏  举报


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

视图变换


拍照:

  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