首页 > 学院 > 开发设计 > 正文

OpenGL 学习笔记3_4(绘制多边形相关)

2019-11-11 03:57:19
字体:
来源:转载
供稿:网友

蓝宝书 第三章

画多边形

构造原则:1 多边形所有点在同一个平面内(建议将一个多边形拆为多个三角形)2 多边形必须是凸的,边的延长线和其他边不能相交

1)绘制四边形

glBegin(GL_QUADS);

glVertex2f(……);

glVertex2f(……);

glVertex2f(……);

glVertex2f(……);

glEnd();

四个点必须在同一个平面

2)绘制连续四边形

glBegin(GL_QUAD_STRip);

glVertex2f(……);点a

glVertex2f(……);点b

glVertex2f(……);点c

glVertex2f(……);点d

glVertex2f(……);点e

glVertex2f(……);点f

glEnd();绘制四边形abcd和cdef,四边形cdef四个点连接顺序不定,点连接方向与四边形abcd相同

3)绘制多边形

glBegin(GL_POLYGON);

glVertex2f(……);点a

glVertex2f(……);点b

glVertex2f(……);点c

glVertex2f(……);点d

glVertex2f(……);点e

glVertex2f(……);点f

glEnd();

绘制多边形abcdef

4)多边形点画模式

glEnable(GL_POLYGON_STIPPLE);启用自定义图形

(GLubyte *) pBitmap;

glPolygonStipple(pBitmap);设置自定义图形,

模板每一行用十六进制表示

相关代码见例3.10

5)三角形拼接多边形时设置边线是否可见

glEdgeFlag (FALSE);glVertex2f(……);……后续顶点开始的线段属于内部线段,不可见

glEdgeFlag (TRUE);glVertex2f(……);……后续顶点开始的线段属于外部线段,可见

参考:点击打开链接

相关代码见例3.11

例3.10多边形点画模式

#include <windows.h>  #include <math.h>  #include <GL/GL.h>  #include <GL/GLU.h>  #include <GL/glut.h>  // Bitmap of campfireGLubyte fire[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x01, 0xf0,0x00, 0x00, 0x07, 0xf0, 0x0f, 0x00, 0x1f, 0xe0,0x1f, 0x80, 0x1f, 0xc0, 0x0f, 0xc0, 0x3f, 0x80,0x07, 0xe0, 0x7e, 0x00, 0x03, 0xf0, 0xff, 0x80,0x03, 0xf5, 0xff, 0xe0, 0x07, 0xfd, 0xff, 0xf8,0x1f, 0xfc, 0xff, 0xe8, 0xff, 0xe3, 0xbf, 0x70,0xde, 0x80, 0xb7, 0x00, 0x71, 0x10, 0x4a, 0x80,0x03, 0x10, 0x4e, 0x40, 0x02, 0x88, 0x8c, 0x20,0x05, 0x05, 0x04, 0x40, 0x02, 0x82, 0x14, 0x40,0x02, 0x40, 0x10, 0x80, 0x02, 0x64, 0x1a, 0x80,0x00, 0x92, 0x29, 0x00, 0x00, 0xb0, 0x48, 0x00,0x00, 0xc8, 0x90, 0x00, 0x00, 0x85, 0x10, 0x00,0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00 };GLboolean bCull = true;GLboolean bDepth = true;GLboolean bOutline = true;GLfloat xRot = 30.0f;GLfloat yRot = 30.0f;// Define a constant for the value of PI  #define GL_PI 3.1415f  // This function does any needed initialization on the rendering  void RenderScene(void){	// Clear the window	glClear(GL_COLOR_BUFFER_BIT);	// Turn culling on if flag is set		glPushMatrix();		glBegin(GL_POLYGON);	glVertex2f(-120.0f, 50.0f);	glVertex2f(20.0f, 50.0f);	glVertex2f(50.0f, 20.0f);	glVertex2f(50.0f, -20.0f);	glVertex2f(20.0f, -50.0f);	glVertex2f(-20.0f, -50.0f);	glVertex2f(-50.0f, -20.0f);	glVertex2f(-50.0f, 20.0f);	glEnd();	// Restore transformations	glPopMatrix();	glutSwapBuffers();}void SetuPRC(){	// Black background	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);	// Set drawing color to red	glColor3f(1.0f, 0.0f, 0.0f);	// Enable polygon stippling	glEnable(GL_POLYGON_STIPPLE);	// Specify a specific stipple pattern	glPolygonStipple(fire);}void ChangeSize(GLsizei w, GLsizei h){	GLfloat nRange = 100.0f;	// Prevent a divide by zero  	if (h == 0)		h = 1;	// Set Viewport to window dimensions  	glViewport(0, 0, w, h);	// Reset projection matrix stack  	glMatrixMode(GL_PROJECTION);	glLoadIdentity();	// Establish clipping volume (left, right, bottom, top, near, far)  	if (w <= h)		glOrtho(-nRange, nRange, -nRange*h / w, nRange*h / w, -nRange, nRange);	else		glOrtho(-nRange*w / h, nRange*w / h, -nRange, nRange, -nRange, nRange);	// Reset Model view matrix stack  	glMatrixMode(GL_MODELVIEW);	glLoadIdentity();}int main(int argc, char* argv[]){	glutInit(&argc, argv);	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);	glutInitWindowSize(800, 600);	glutCreateWindow("Bounce");	glutDisplayFunc(RenderScene);//显示回调函数  	glutReshapeFunc(ChangeSize);//窗口大小变形回调函数  	SetupRC();	glutMainLoop();	return 0;}例3.11三角形拼接多边形时设置边线是否可见

#include <windows.h>  #include <math.h>  #include <GL/GL.h>  #include <GL/GLU.h>  #include <GL/glut.h>  // Define a constant for the value of PI  #define GL_PI 3.1415f  // This function does any needed initialization on the rendering  void RenderScene(void){	// Clear the window	glClear(GL_COLOR_BUFFER_BIT);	// Turn culling on if flag is set	GLboolean bEdgeFlag = FALSE;	glPushMatrix();		glBegin(GL_TRIANGLES);	glEdgeFlag(bEdgeFlag);	glVertex2f(-20.0f, 0.0f);	glEdgeFlag(TRUE);	glVertex2f(20.0f, 0.0f);	glVertex2f(0.0f, 40.0f);	glVertex2f(-20.0f, 0.0f);	glVertex2f(-60.0f, -20.0f);	glEdgeFlag(bEdgeFlag);	glVertex2f(-20.0f, -40.0f);	glEdgeFlag(TRUE);	glVertex2f(-20.0f, -40.0f);	glVertex2f(0.0f, -80.0f);	glEdgeFlag(bEdgeFlag);	glVertex2f(20.0f, -40.0f);	glEdgeFlag(TRUE);	glVertex2f(20.0f, -40.0f);	glVertex2f(60.0f, -20.0f);	glEdgeFlag(bEdgeFlag);	glVertex2f(20.0f, 0.0f);	glEdgeFlag(TRUE);	// Center square as two triangles	glEdgeFlag(bEdgeFlag);	glVertex2f(-20.0f, 0.0f);	glVertex2f(-20.0f, -40.0f);	glVertex2f(20.0f, 0.0f);	glVertex2f(-20.0f, -40.0f);	glVertex2f(20.0f, -40.0f);	glVertex2f(20.0f, 0.0f);	glEdgeFlag(TRUE);	// Done drawing triangles	glEnd();	// Restore transformations	glPopMatrix();	glutSwapBuffers();}void SetupRC(){	// Black background	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);	// Set drawing color to red	glColor3f(1.0f, 0.0f, 0.0f);	//glPolygonMode(GL_BACK, GL_LINE);	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 	// Enable polygon stippling	//glEnable(GL_POLYGON_STIPPLE);	// Specify a specific stipple pattern	//glPolygonStipple(fire);}void ChangeSize(GLsizei w, GLsizei h){	GLfloat nRange = 100.0f;	// Prevent a divide by zero  	if (h == 0)		h = 1;	// Set Viewport to window dimensions  	glViewport(0, 0, w, h);	// Reset projection matrix stack  	glMatrixMode(GL_PROJECTION);	glLoadIdentity();	// Establish clipping volume (left, right, bottom, top, near, far)  	if (w <= h)		glOrtho(-nRange, nRange, -nRange*h / w, nRange*h / w, -nRange, nRange);	else		glOrtho(-nRange*w / h, nRange*w / h, -nRange, nRange, -nRange, nRange);	// Reset Model view matrix stack  	glMatrixMode(GL_MODELVIEW);	glLoadIdentity();}int main(int argc, char* argv[]){	glutInit(&argc, argv);	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);	glutInitWindowSize(800, 600);	glutCreateWindow("Bounce");	glutDisplayFunc(RenderScene);//显示回调函数  	glutReshapeFunc(ChangeSize);//窗口大小变形回调函数  	SetupRC();	glutMainLoop();	return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表