Win7环境使用VC2008进行OpenGL编程

2012-03-12 19:33:35|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 图形/图像, MFC|来源:唯设编程网

5.4. 具体的OpenGL绘图函数

// 执行绘图操作
void COpenGLLib::draw(){
	//启用双缓存
	static BOOL bBusy=FALSE;
	if(bBusy)
		return;
	bBusy=TRUE;
	//背景色
	glClearColor(0.2f,0.2f,0.5f,1.0f);
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	//棋盘位图
	double bitmap[100]={
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,1,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,0,0,0,
		1,0,0,0,0,0,0,0,0,1,
		0,0,0,0,0,1,0,0,0,1
	};
	CMatrix matrixBitmap(10,10,bitmap);
	//绘制棋盘
	drawChessboard(matrixBitmap);
	//完成绘制
	glFinish();
	//双缓存应用
	SwapBuffers(wglGetCurrentDC());
	bBusy=FALSE;
}

为了避免屏幕闪烁,本示例中使用了双缓存技术,为了增加程序的通用性和扩展性,本示例将具体的绘制逻辑独立出来了,具体的绘制代码如下:

//draw的实现函数,以后采用外部接入的方式
void COpenGLLib::drawChessboard(CMatrix& bitmap){
	//移动
	glTranslatef(-0.0f,0.0f,-6.0f);
	glScalef(1.0f,1.0f,1.0f);
	//glRotatef(90.0f,1.0f,0.0f,0.0f);
	//1.画棋盘		
	glLineWidth(lWidth[1]);			//设置线宽
	//接受线型设置
	glEnable(GL_LINE_STIPPLE);
	glEnable(GL_POINT_SMOOTH);
	//设置线型
	glLineStipple(1,0xFFFF);
	glBegin(GL_LINES);
	glColor3f(0.0f,1.0f,1.0f);
	//画竖线
	for(GLfloat i=0;i<bitmap.getRowCount();i++){		
		glVertex3f(i-4.5f,-4.5f,0.0f);
		glVertex3f(i-4.5f,4.5f,0.0f);	
	}
	//画横线
	for(GLfloat j=0;j<bitmap.getColCount();j++){		
		glVertex3f(-4.5f,j-4.5f,0.0f);
		glVertex3f(4.5f,j-4.5f,0.0f);	
	}
	glEnd();	
	glDisable(GL_POINT_SMOOTH);
	glDisable(GL_LINE_STIPPLE);

	//2.画棋子
	for(size_t row=1;row<=bitmap.getRowCount();row++){
		for(size_t col=1;col<=bitmap.getColCount();col++){
			if(fabs(bitmap[row][col]-1.0)<1e-10){
				glPushMatrix();
				glTranslatef((GLfloat)col-1.0f-4.5f,-((GLfloat)row-1.0f-4.5f),0.0f);
				glScalef(0.5f,0.5f,1.0f);				
				//绘制棋子
				drawChessman();
				glPopMatrix();
			}
		}
	}
}
//绘制一个棋子
//直径为1
void COpenGLLib::drawChessman(){
	GLfloat radius=0.5f;		//半径
	//1.画基座圆
	glBegin(GL_TRIANGLE_FAN);
	glColor3f(1.0f,0.0f,1.0f);	
	glVertex3f(0.0f,0.0f,0.0f);
	glColor3f(0.0f,1.0f,0.0f);
	for(GLfloat angle=0;angle<361;angle++){		
		glVertex3f(radius*cos(PI*angle/180.0f),radius*sin(PI*angle/180.0f),0.0f);
	}	
	glEnd();
	//2.画上部拱形
	glBegin(GL_QUAD_STRIP);
	glColor3f(0.5f,0.0f,1.0f);
	for(GLfloat angle=0;angle<182;angle++){
		glPushMatrix();
		glRotatef(angle,0.0f,0.0f,1.0f);		//绕Z轴旋转对应角度°
		for(GLfloat x=-0.5;x<=0.5;x+=0.05f){
			glPushMatrix();
			glVertex3d(x,0.0,-1.2*x*x+0.2);
			glRotatef(1.0f,0.0f,0.0f,1.0f);		//绕Z轴旋转1°
			glVertex3d(x,0.0,-1.2*x*x+0.2);
			glPopMatrix();
		}
		glPopMatrix();
	}
	glEnd();
}

至此,OpenGL绘图类COpenGLLib就已经完成了,本类主要演示了OpenGL环境的配置方法,供入门的初学者参考,所以仅仅绘制了一个简单的五子棋棋盘。下面我们将编写COpenGLLib的测试程序。

发表评论0条 】
网友评论(共?条评论)..
Win7环境使用VC2008进行OpenGL编程