《计算机图形学》读书笔记(二)

来源:互联网 发布:java有界面的atm机 编辑:程序博客网 时间:2024/05/16 03:08

第二章opengl绘图入门

2.1 生成图像初步

看完这节,自己感觉为后便铺垫的一点就是坐标系的建立,在opengl里,初始坐标是x向右递增,y向上递增。

有些段落时为了以后更深入理解opengl里的函数包做出解释

比如说 伪代码  line(100,50,150,80)其函数原型lineTo

当然,lineTo 函数和drawDot函数一样是需要自己定义的。至于具体怎么样定义,后边会做具体解释。

还有关于cp的概念,以后再做仔细的研究。

2.11

设备无关的编程和opengl

 设备无关的编程:同样的程序可以再不同的图形环境里编译和运行,并且能保证在每台机器上显示相同的图形。

2.12窗口的编程

自己感觉关于事件驱动的编程有点儿深奥~C++学的还是不够深入,而且感觉这方便的知识应该在2.5键盘函数的调用上有关,在看看2.5时在对这段话着重理解。

总之,窗口的创建有以下基本操作:

1.   设计一个窗口类

2.   注册窗口类

3.   创建窗口类

4.   显示及更新窗口

5.   消息循环。(自己也是编程菜鸟,欢迎众位拍砖)

好了,下面就涉及到我关注的重点:OPENGL

4种主要的opengl库:

1基本gl库:它提供opengl的基本函数。

2 GLUT库:GL实用工具包,他主要用来打开窗口,开发和管理菜单,以及管理菜单等。

  3 GLU 库:GL实用库,他提供高级例程,处理矩阵操作和绘制二次曲面如球和2次圆柱体。

  4GLUI库,只要使用GLUTGLUI就将适当的运行。GLUIOPENGL程序提供了良好的控制工具和菜单。

glutDisplayFunc(myDisplay)

glutReshapefunc(myReshape)

还有一些鼠标,键盘触发回调函数,就不一一列出了。

最后一个函数glutMainLoop().

当执行这个函数时,程序绘制完初始图形,并进入循环,一直等待时间发生。

2.13如何打开一个窗口画图

void main(int argc,char** argv)

glutInit(&argc,argv);                     //初始化工具包

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

// GLUT_SINGLE|GLUT_RGB为两个或关系的状态常量,表明应分配单个显示缓存,而且颜色有所需的红绿蓝三色的数量来指定

glutInitWindowSize(640,480);//指定窗口的大小

glutInitWindowPosition(100,150)该函数指定窗口在屏幕上相对于左上角的位置,拒左边100个像素,顶点150个像素。

glutCreateWindow(“创建窗口的名字”)

//注册回调函数

glutDisplayFunc(myDisplay);

glutReshapeFunc(myReshape);

glutMouseFunc(myMouse);

glutKeyboardFunc(myKenboard);

myInit();

glutMainLoop();

}

2.2 opengl基本元素图形

具体感念就在这一一略过,感兴趣的朋友可以自己去看书,这里就把已经运行的程序拿出来,最一些具体的函数写一些自己的感想。同时把几个重要函数标出。

#include<windows.h>

#include<gl.h>

#include<glu.h>

#include<glut.h>

#include<math.h>

const int screenWidth=640;

const int screenHeight=480;

GLdouble A,B,C,D;

/*struct GLPoint{

   GLfloat x,y;

};

void drawDot(int x, int y)

//书中没有该函数的定义,后来查找才发现,函数根本就不是库函数里的一员,需要自己定义。同时对于glBegin()glEnd也需要多多关注。

 {

   glBegin(GL_POINTS);

   glVertex2f(x,y);

   glEnd();

   glFlush();

}*/

//定义myinit函数,在函数中初始化背景,点颜色等

void myInit(void)

{

   glClearColor(1.0,1.0,1.0,0.0);//使北京变为所需要的颜色,RBG结构。

   glColor3f(0.0f,0.0f,0.0f);//所要画点的颜色

   glPointSize(2.0);//所要画点的大小

   glMatrixMode(GL_PROJECTION);     //设置合适的矩阵:发射矩阵。

   glLoadIdentity();

   gluOrtho2D(0.0,640.0,0.0,480.0); //这三个函数都是不知道的属性设置,还需积雪学习  同时这三个函数也是在建立一个简单的坐标系,在后边涉及到立体坐标系的时候应该有所改变

   A=screenWidth/4;

   B=0.0;

   C=D=screenHeight/2.0;

}

//画点函数,整个函数的关键部分

void myDisplay(void)

{

   glClear(GL_COLOR_BUFFER_BIT); //GL_COLOR_BUFFER_BIT是一个内置常数

   glBegin(GL_POINTS);// GL_POINTS是一个控制常量,可是是划线,也可以使画多变形。

for(GLdouble x=0;x<55000;x+=0.005)

{

   GLdouble func=exp(-x)*cos(2*3.14159265*x);

glVertex2d(A*x+B,C*func+D);

}

   glEnd();

   glFlush();

}//所画函数的核心语句,每个点都取值。

/*void sierpinski_render(void)   //这个函数时画赛平斯基的函数

{

   glClear(GL_COLOR_BUFFER_BIT);

   GLPoint T[3]={{10,10},{600,10},{300,450}};    //定义三个不同的点

   int index=rand()%3;

   GLPoint point=T[index];

    drawDot(point.x,point.y);

   for(int i=0;i<55000;i++)

   {

          index=rand()%3;   //取任意值的函数

          point.x=(point.x+T[index].x)/2;

          point.y=(point.y+T[index].y)/2;

          drawDot(point.x,point.y);

   }

   glFlush();   //保证所有数据被显示并处理

}*/

 

void main(int argc,char ** argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(640,480);

glutInitWindowPosition(100,150);

glutCreateWindow("my firse open gl");

glutDisplayFunc(myDisplay);

myInit();

glutMainLoop();

}

后边的主函数在前边已经写过心得,就不多说了~呵呵~这是我写的第一个图形。图形出现的时候,我觉得一切都是值得的。

原创粉丝点击