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

 

第二章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库,只要使用GLUT,GLUI就将适当的运行。GLUI为OPENGL程序提供了良好的控制工具和菜单。
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();
}
后边的主函数在前边已经写过心得,就不多说了~呵呵~这是我写的第一个图形。图形出现的时候,我觉得一切都是值得的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值