代码基于前面的QT+SDL+OPENGL的架构
顺便在上面研究下OPENGL的代码
首先是最基本的点的理解。
首先看一下OPNEGL的坐标系
典型的XYZ坐标系,有高中的立体几何的知识就可以轻松搞定。
下面我们尝试来画点。首先点的定义有好几种方式,目前我们只用向量的方式,也就是一个数组,一个(X,Y,Z)的数组
static GLfloat v0[] = {1.0f, 1.0f, 0.0f};
这就定义了一个点的坐标,还是个浮点类型的。参数分别就是X,Y,Z轴的坐标。
如果点是(0,0,0)的话
不知道为什么,点向X轴方向偏移了一个像素~~
画点部分的代码应该是
glBegin(GL_POINTS);
glColor4ubv( red );
glVertex3fv( v0 );
glEnd();
这里GL_POINTS控制了说明是画点的操作,这里还涉及了颜色的问题
static GLubyte red[] = {255, 0 , 0 , 255};
static GLubyte black[] = {0, 0, 0, 255};
看了颜色的定义就明白了,颜色也是个数组,R,G,B,A带有透明度的。
上面的代码我们定义了一个点的颜色。
下面再看几个点的
点挺小的,要仔细看才能看出来
再来一个
这个点是(-1,-1,1),这里没有画出坐标系的参考线,不过大致的偏移是没问题的。
这里,有人会问了,线怎么画的?我就定义两个点,然后画线就是了,下面给出代码
static GLfloat x0[] = {-10.0f, 0.0f, 0.0f};
static GLfloat x1[] = {10.0f, 0.0f, 0.0f};
static GLfloat y0[] = {0.0f, -10.0f, 0.0f};
static GLfloat y1[] = {0.0f, 10.0f, 0.0f};
static GLfloat z0[] = {0.0f, 0.0f, -10.0f};
static GLfloat z1[] = {0.0f, 0.0f, 10.0f};
画线的话,改一下上面画点的参数
glBegin(GL_LINES);
glColor4ubv( black );
glVertex3fv(x0);
glColor4ubv( black );
glVertex3fv(x1);
glColor4ubv( black );
glVertex3fv(y0);
glColor4ubv( black );
glVertex3fv(y1);
glColor4ubv( black );
glVertex3fv(z0);
glColor4ubv( black );
glVertex3fv(z1);
glEnd();
这里,有人会发现,我们是XYZ坐标系,但是现在只出现了XY没有Z。
是的因为还有段代码是
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
这里面的重点是gluLookAt函数。后面跟了9个参数~~恐怖啊
首先说这个函数是用来确定照相机的位置的,照相机嘛~~照相机在哪儿咱就从哪儿开始观察的。
前面三个是X,Y,Z的位置,也就是照相机在空间里的位置,通过这个可以移动照相机的位置
中间三个是照相机镜头对准的点,我们这里对准的是0,0,0原点。也就是对焦的点啦
后面三个比较个性,是照相机朝向~~,你看我们都用过照相机把,中间有个取景器,上面有个快门,OK,你可以理解快门的方向就是后面这三个参数所构成的向量的方向。这里我们的0,1,0表示正常情况下端着照相机的方向。
这就好理解了,照相机放在Z轴正向的位置,对着原点,也就是Z轴负方向,照相机朝上拿着就是Y轴正向,那我们看到的就是XOY面的正视图啦。~~正视图~~懂了不。
最后,我们改变一下照相机的位置,再来看一看。
这是在(-1,-5,0)的位置上画的,这时候的观察角度是
gluLookAt(5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
是的,没错,(5,5,5)是三个轴的正方向的区域,一个俯视45度角的角度来观察的。
向量的方向~~(1,1,1),自己比划比划~~,照相机就在这条线上~~
到现在,差不多,点的方面可以有所掌握了,主要还是对坐标系统有所了解了。