《计算机图形学》读书笔记(二)
来源:互联网 发布: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库,只要使用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();
}
后边的主函数在前边已经写过心得,就不多说了~呵呵~这是我写的第一个图形。图形出现的时候,我觉得一切都是值得的。
- 《计算机图形学》读书笔记(二)
- 《计算机图形学》读书笔记(二)
- 计算机图形学(二)
- 计算机图形学(二)
- 《计算机图形学》读书笔记(一)
- 《计算机图形学》读书笔记(一)
- 计算机图形学学习记录(二)
- 计算机图形学(二)输出图元
- 计算机图形学笔记---Cg语言(二)
- 《计算机图形学》学习笔记(二)
- 计算机图形学 所需要的数学知识--<<计算机图形学(第三版)>>读书笔记
- 计算机图形学(第四版)- 输出图元-读书笔记P37
- 计算机图形学(一)
- 计算机图形学(一)
- 计算机图形学(二)输出图元_9_填充区图元
- 计算机图形学(二)输出图元_12_OpenGL顶点数组
- 计算机图形学(二)输出图元_16_字符函数
- 计算机图形学(二)输出图元_17_图形分割
- 必须掌握的八大命令行
- 开始→运行→命令集锦
- 睡眠
- 常见电脑故障解决方案
- the Secret DAILY TEACHINGS-Day 38
- 《计算机图形学》读书笔记(二)
- PHP多语言系统的一种实现方式[转]
- 开学一个月
- js知识总汇
- javax.naming.NoInitialContextException hibernate错误的解决方法
- 光盘加密
- Windows程序设计:GDI结构和设备内容
- WinCE 发展
- 菜鸟学习OGRE和天龙八部之十: frame动画基本搞定,遇到点问题