这是用多边形模拟英文I love you的三维显示效果:I ❤ U
主体代码来自于网上,
主要的改进是加入了在OpenGL中显示文字(英文和数字,中文还不能显示)。
先看效果:
http://s12/middle/40d73279ta53de0537cab&690LOVE YOU" TITLE="OpenGL学习——计算机图形学作业:三维显示I LOVE YOU" />
http://s13/middle/40d73279ta53de056baec&690LOVE YOU" TITLE="OpenGL学习——计算机图形学作业:三维显示I LOVE YOU" />
---------------------------------------------------------------------------------------
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
#define
MAX_CHAR
128
void drawString(const char* str)
{
static int
isFirstCall = 1;
static
GLuint lists;
if(
isFirstCall )
{
isFirstCall = 0;
lists = glGenLists(MAX_CHAR);
wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
}
for(; *str!='\0'; ++str)
glCallList(lists + *str);
}
// 渲染图形
void RenderScene(void)
{ glClear( GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT );
// 以下代码在图形上方显示作者信息
glColor3f(1.0f, 0.0f, 0.0f);
glRasterPos2f(-100.0f, 95.0f); drawString("This
is the homework of the course <Computer
Graphic>:");
glColor3f(.0f, 1.0f, 1.0f);
glRasterPos2f(-100.0f, 90.0f);
drawString("Author: ************");
glRasterPos2f(-100.0f, 85.0f);
drawString("Student ID:
**********
");
glRasterPos2f(-120.0f, 80.0f);
drawString("Institute of Automation, Chinese Academy of
Sciences
");
//以下代码显示键盘操作指南:
glColor3f(0.0f, 0.0f, 1.0f);
glRasterPos2f(-120.0f, 70.0f);
drawString("");
glColor3f(1.0f, 0.0f,
1.0f);
glRasterPos2f(-120.0f, 60.0f);
drawString("Press the Left or Right Direction
Key: Rotate it By the
Y axis/ Rotate to Left or Right ");
glRasterPos2f(-120.0f, 50.0f);
drawString("Press the Up or Down Direction
Key: Rotate it By the
X axis /Rotate to Up or Down");
//图形渲染开始:
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
//用多边形模拟心形图案:正面为红色
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 255, (GLubyte)0,
(GLubyte)0);
glVertex3f(0.0f,6.0f,8.0f);
glVertex3f(-10.0f,18.0f,8.0f);
glVertex3f(-31.0f,18.0f,8.0f);
glVertex3f(-38.0f,6.0f,8.0f);
glVertex3f(-26.0f,-20.0f,8.0f);
glVertex3f(0.0f,-46.0f,8.0f);
glVertex3f(26.0f,-20.0f,8.0f);
glVertex3f(38.0f,6.0f,8.0f);
glVertex3f(31.0f,18.0f,8.0f);
glVertex3f(10.0f,18.0f,8.0f);
glEnd();
//用多边形模拟心形图案:
glBegin(GL_POLYGON);
glColor3ub((GLubyte)220, (GLubyte)0,
(GLubyte)0);
glVertex3f(0.0f,6.0f,-8.0f);
glVertex3f(10.0f,18.0f,-8.0f);
glVertex3f(31.0f,18.0f,-8.0f);
glVertex3f(38.0f,6.0f,-8.0f);
glVertex3f(26.0f,-20.0f,-8.0f);
glVertex3f(0.0f,-46.0f,-8.0f);
glVertex3f(-26.0f,-20.0f,-8.0f);
glVertex3f(-38.0f,6.0f,-8.0f);
glVertex3f(-31.0f,18.0f,-8.0f);
glVertex3f(-10.0f,18.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 220, (GLubyte)0, (GLubyte)0);
glVertex3f(0.0f,6.0f,8.0f);
glVertex3f(10.0f,18.0f,8.0f);
glVertex3f(4.0f,28.0f,0.0f);
glVertex3f(0.0f,16.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 220, (GLubyte)0, (GLubyte)0);
glVertex3f(0.0f,6.0f,8.0f);
glVertex3f(0.0f,16.0f,0.0f);
glVertex3f(-4.0f,28.0f,0.0f);
glVertex3f(-10.0f,18.0f,8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 220, (GLubyte)0,
(GLubyte)0);
glVertex3f(0.0f,16.0f,0.0f);
glVertex3f(4.0f,28.0f,0.0f);
glVertex3f(10.0f,18.0f,-8.0f);
glVertex3f(0.0f,6.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 220, (GLubyte)0,
(GLubyte)0);
glVertex3f(-4.0f,28.0f,0.0f);
glVertex3f(0.0f,16.0f,0.0f);
glVertex3f(0.0f,6.0f,-8.0f);
glVertex3f(-10.0f,18.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 221,
(GLubyte)0, (GLubyte)0);
glVertex3f(10.0f,18.0f,8.0f);
glVertex3f(31.0f,18.0f,8.0f);
glVertex3f(36.0f,28.0f,0.0f);
glVertex3f(4.0f,28.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 221,
(GLubyte)0, (GLubyte)0);
glVertex3f(-31.0f,18.0f,8.0f);
glVertex3f(-10.0f,18.0f,8.0f);
glVertex3f(-4.0f,28.0f,0.0f);
glVertex3f(-36.0f,28.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte)0,(GLubyte)0,
(GLubyte)0);
glVertex3f(4.0f,28.0f,0.0f);
glVertex3f(36.0f,28.0f,0.0f);
glVertex3f(31.0f,18.0f,-8.0f);
glVertex3f(10.0f,18.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 0,
(GLubyte)0, (GLubyte)0);
glVertex3f(-10.0f,18.0f,-8.0f);
glVertex3f(-31.0f,18.0f,-8.0f);
glVertex3f(-36.0f,28.0f,0.0f);
glVertex3f(-4.0f,28.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 222,
(GLubyte)0, (GLubyte)0);
glVertex3f(31.0f,18.0f,8.0f);
glVertex3f(38.0f,6.0f,8.0f);
glVertex3f(48.0f,12.0f,0.0f);
glVertex3f(36.0f,28.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 222,
(GLubyte)0, (GLubyte)0);
glVertex3f(-38.0f,6.0f,8.0f);
glVertex3f(-31.0f,18.0f,8.0f);
glVertex3f(-36.0f,28.0f,0.0f);
glVertex3f(-48.0f,12.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 222,
(GLubyte)0, (GLubyte)0);
glVertex3f(36.0f,28.0f,0.0f);
glVertex3f(48.0f,12.0f,0.0f);
glVertex3f(38.0f,6.0f,-8.0f);
glVertex3f(31.0f,18.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 222,
(GLubyte)0, (GLubyte)0);
glVertex3f(-48.0f,12.0f,0.0f);
glVertex3f(-36.0f,28.0f,0.0f);
glVertex3f(-31.0f,18.0f,-8.0f);
glVertex3f(-38.0f,6.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 223,
(GLubyte)0, (GLubyte)0);
glVertex3f(38.0f,6.0f,8.0f);
glVertex3f(26.0f,-20.0f,8.0f);
glVertex3f(38.0f,-16.0f,0.0f);
glVertex3f(48.0f,12.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 223,
(GLubyte)0, (GLubyte)0);
glVertex3f(-26.0f,-20.0f,8.0f);
glVertex3f(-38.0f,6.0f,8.0f);
glVertex3f(-48.0f,12.0f,0.0f);
glVertex3f(-38.0f,-16.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 223,
(GLubyte)0, (GLubyte)0);
glVertex3f(48.0f,12.0f,0.0f);
glVertex3f(38.0f,-16.0f,0.0f);
glVertex3f(26.0f,-20.0f,-8.0f);
glVertex3f(38.0f,6.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 223,
(GLubyte)0, (GLubyte)0);
glVertex3f(-38.0f,6.0f,-8.0f);
glVertex3f(-26.0f,-20.0f,-8.0f);
glVertex3f(-38.0f,-16.0f,0.0f);
glVertex3f(-48.0f,12.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 224,
(GLubyte)0, (GLubyte)0);
glVertex3f(0.0f,-46.0f,8.0f);
glVertex3f(0.0f,-52.0f,0.0f);
glVertex3f(38.0f,-16.0f,0.0f);
glVertex3f(26.0f,-20.0f,8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 224,
(GLubyte)0, (GLubyte)0);
glVertex3f(0.0f,-46.0f,8.0f);
glVertex3f(-26.0f,-20.0f,8.0f);
glVertex3f(-38.0f,-16.0f,0.0f);
glVertex3f(0.0f,-52.0f,0.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 224,
(GLubyte)0, (GLubyte)0);
glVertex3f(38.0f,-16.0f,0.0f);
glVertex3f(0.0f,-52.0f,0.0f);
glVertex3f(0.0f,-46.0f,-8.0f);
glVertex3f(26.0f,-20.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 224,
(GLubyte)0, (GLubyte)0);
glVertex3f(0.0f,-46.0f,-8.0f);
glVertex3f(0.0f,-52.0f,0.0f);
glVertex3f(-38.0f,-16.0f,0.0f);
glVertex3f(-26.0f,-20.0f,-8.0f);
glEnd();
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 220,
(GLubyte)244, (GLubyte)220);
glVertex3f(70.0f,6.0f,6.0f);
glVertex3f(70.0f,-30.0f,6.0f);
glVertex3f(78.0f,-30.0f,6.0f);
glVertex3f(78.0f,6.0f,6.0f);
glEnd();
//'u' -a1
glBegin(GL_POLYGON);
glColor3ub((GLubyte) 220,
(GLubyte)244, (GLubyte)220);