前面画的虽然都是三维的点操作,但是画出的图形看不出三维的效果
简单的理解一下:三维里的图形比二维多的是 视点与物体的相对位置布局,以及有投影变换
所以我们需要理解的三维中的几个概念:
视图变换----观测三维模型的角度不同,显示内容不同
模型变换----三维模型的放大,缩小,移动,旋转
投影----三维模型应该近大远小
视口的设置-----只看模型一部分,该如何显示,选择性视野忽略症
双缓存-----显存里一块用来绘制图形,一块用来显示,提高性能用
垂直同步------全部绘制好了再显示,提高性能用
FPS的测试方法:FPS即每秒多少针,测试方法是多次求平均值
一个三维图形代码的例子框架与解释,一般是先设置投影,再设置视图,再画
#include <GLUT/GLUT.h>
#include <math.h>
void display( void ){
//清除颜色缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//先设置投影参数再设置视点布局参数
//投影参数解决视角,长宽比,近点,远点4个问题
//视点布局解决眼睛位置,物体位置,眼睛与物体方向 3个问题
//设置投影变换参数
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective // 设置透视图
(45, // 透视角设置为 45 度,在Y方向上以角度为单位的视野
1.0, // 窗口的宽与高比
0.1f, // 视野透视深度:近点1.0f
3000.0f // 视野透视深度:始点0.1f远点1000.0f
);
//开始画模型
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//眼睛位于(0,10,100)位置,物体位于(0,0,0)位置,方向是从上往下看(0,1,0)
gluLookAt(10,10,100,0,0,0,0,1,0);
glColor3f(0.5f, 0.7f, 1.0f);
//生成三角
glBegin(GL_LINES);
for(int i=-1000;i<=1000;i+=10)
{
glVertex3f(0,0,i);
glVertex3f(10,10,i);
glVertex3f(0,0,i);
glVertex3f(-10,10,i);
}
glEnd();
//生成网络
int x=(int)(40*2);
glBegin(GL_LINES);
for(int i=-x;i<=x;i+=4)
{
glVertex3i(-x,0,i);
glVertex3i(x,0,i);
glVertex3i(i,0,x);
glVertex3i(i,0,-x);
}
glEnd();
//生成球体
GLUquadricObj * pObj;
pObj = gluNewQuadric();
gluQuadricDrawStyle(pObj,GLU_LINE);
gluQuadricNormals(pObj,GLU_SMOOTH);
gluSphere(pObj,16,16,16);
glFlush();
}
void testDisplay(void){
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //设置显示属性为RBGA颜色,双缓存
glutInitWindowPosition(200, 200);//设置窗口位置
glutInitWindowSize(WIDTH,HEIGHT);//设置窗口大小
glutCreateWindow("OpenGL测试");//生成窗口
glutDisplayFunc(&display);//设置显示回调函数
}
/***************************/
int main(int argc, const char * argv[])
{
glutInit(&argc, argv);//初始化GLUT
testDisplay();
glutMainLoop();//事件循环
return 0;}