opengl绘制卡通人物哆啦A梦

前段时间老师布置一作业,我画了一个哆啦A梦,代码如下

#include <Windows.h>
#include <gl\glut.h>
#include <stdio.h>  
#include<math.h>

#define GLUT_DISABLE_ATEXIT_HACK 
#define N 100
const GLfloat tempR = 0.5f;//脸半径
const GLfloat PI = 3.1415926536f;


//颜色设置
static GLfloat ColorChoose[5][3] = {
	{ 0.0, 0.74, 1.0 }, { 1.0, 1.0, 1.0 }, { 1.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 },
	{ 1.0, 1.0, 0.0 } };

static GLfloat r = 1.0f, g = 1.0f, b = 0.0f;
static GLfloat spin = 0.0;
int fg = 0;
static float x = 400, y = 400;

static int FACE_COLOR = 0;//湖蓝色
static int EYE_COLOR = 1;//白色
static int NOSE_COLOR = 2;//红色
static int LINE_COLOR = 3;//黑色
static int LINGDANG_COLOR = 4;//黄色




//画脸 0.0, 0.4, 0.4
void face(float x, float y, float radius)
{
	int count;
	int sections = 200;

	GLfloat TWOPI = 2.0f * 3.14159f;

	//glLineWidth(1.f);
	glColor3f(ColorChoose[FACE_COLOR][0], ColorChoose[FACE_COLOR][1], ColorChoose[FACE_COLOR][2]);
	glBegin(GL_TRIANGLE_FAN);
	glVertex2f(x, y);

	for (count = 0; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}

//脸白
void face1(float x, float y, float radius)
{
	int count;
	int sections = 200;

	GLfloat TWOPI = 2.0f * 3.14159f;

	//glLineWidth(1.f);
	glColor3f(ColorChoose[EYE_COLOR][0], ColorChoose[EYE_COLOR][1], ColorChoose[EYE_COLOR][2]);
	glBegin(GL_TRIANGLE_FAN);
	glVertex2f(x, y);

	for (count = 0; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}

//描线
void drawline(float x, float y, float radius)
{
	int count;
	int sections = 200;

	GLfloat TWOPI = 2.0f * 3.14159f;
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINE_STRIP);
	for (count = 0; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}

//嘴巴
void mouthhalf(float x, float y, float radius)
{
	int count;
	int sections = 200;

	GLfloat TWOPI = 2.0f * 3.14159f;

	//glLineWidth(1.f);
	glColor3f(ColorChoose[NOSE_COLOR][0], ColorChoose[NOSE_COLOR][1], ColorChoose[NOSE_COLOR][2]);
	glBegin(GL_TRIANGLE_FAN);
	glVertex2f(x, y);

	for (count = 100; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}



//嘴巴描线
void drawlinehalfmouth(float x, float y, float radius)
{
	int count;
	int sections = 200;

	GLfloat TWOPI = 2.0f * 3.14159f;
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
    //嘴上那个横线
	glBegin(GL_LINES);
	glVertex2f(-0.2, 0.26);
	glVertex2f(0.2, 0.26);
	glEnd();
	//嘴巴半圆绘制,用红色填充
	glBegin(GL_LINE_STRIP);
	for (count = 100; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}

//画眼睛
void eyes(float x, float y, float radius)
{
	int count;
	int sections = 200;

	GLfloat TWOPI = 3.0f * 3.14159f;

	glColor3f(ColorChoose[EYE_COLOR][0], ColorChoose[EYE_COLOR][1], ColorChoose[EYE_COLOR][2]);
	glBegin(GL_TRIANGLE_FAN);
	glVertex2f(x, y);

	for (count = 0; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}

//眼珠子
void eyeskernel(float x, float y, float radius)
{
	//眼珠子
	int count;
	int sections = 200;

	GLfloat TWOPI = 3.0f * 3.14159f;

	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_TRIANGLE_FAN);
	glVertex2f(x, y);

	for (count = 0; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}


//画鼻子
void nose(float x, float y, float radius)
{
	int count;
	int sections = 200;

	GLfloat TWOPI = 2.0f * 3.14159f;

	//glLineWidth(1.f);
	glColor3f(ColorChoose[NOSE_COLOR][0], ColorChoose[NOSE_COLOR][1], ColorChoose[NOSE_COLOR][2]);
	glBegin(GL_TRIANGLE_FAN);
	glVertex2f(x, y);

	for (count = 0; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}


//鼻子线+胡子+牙齿
void nosebeard()
{
	//鼻子线 1条直线
	//glClear(GL_COLOR_BUFFER_BIT);
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINES);
	glVertex2f(0.0, 0.47);
	glVertex2f(0.0, 0.26);
	glEnd();

	//胡须 4根
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINES);
	glVertex2f(-0.07, 0.40);
	glVertex2f(-0.25, 0.45);
	
	glVertex2f(0.07, 0.40);
	glVertex2f(0.25, 0.45);

	glVertex2f(-0.07, 0.36);
	glVertex2f(-0.25, 0.34);

	glVertex2f(0.07, 0.36);
	glVertex2f(0.25, 0.34);
	glEnd();
	
}

//装饰物:铃铛
void decorate(float x, float y, float radius)
{
	int count;
	int sections = 200;

	GLfloat TWOPI = 2.0f * 3.14159f;

	//铃铛
	glColor3f(r,g,b);
	glBegin(GL_TRIANGLE_FAN);
	glVertex2f(x, y);

	for (count = 0; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();


}
//下半圆
void halfdown(float x, float y, float radius)
{
	int count;
	int sections = 200;
	GLfloat TWOPI = 2.0f * 3.14159f;
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINE_STRIP);
	for (count = 100; count <= sections; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}

//上半圆
void halfup(float x, float y, float radius)
{
	int count;
	int sections = 200;
	GLfloat TWOPI = 2.0f * 3.14159f;
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINE_STRIP);
	for (count = 0; count <= sections/2; count++)
	{
		glVertex2f(x + radius*cos(count*TWOPI / sections), y + radius*sin(count*TWOPI / sections));
	}
	glEnd();
}

//身体
void body()
{
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	//左边拳头
	drawline(-0.40, 0.14, 0.08);
	//左边手臂
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINES);
	glVertex2f(-0.40,0.07);
	glVertex2f(-0.28, -0.1);
	glEnd();
	//右边拳头
	drawline(0.32, 0.026, 0.08);
	//右边手臂
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINES);
	glVertex2f(0.32, -0.06);
	glVertex2f(0.23, -0.16);
	glEnd();
	//矩形身体
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINES);
	glVertex2f(-0.28, -0.1);
	glVertex2f(-0.28, -0.41);
	glEnd();

	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINES);
	glVertex2f(0.23, -0.16);
	glVertex2f(0.23, -0.41);
	glEnd();

	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINES);
	glVertex2f(-0.28, -0.41);
	glVertex2f(0.23, -0.41);
	glEnd();

	//腿子 下半圆
	halfdown(-0.17, -0.4, 0.12);
	halfdown(0.12, -0.4, 0.12);
	//双脚之间
	//halfup(-0.025, - 0.4,0.02);

	//包	
	halfdown(0.0, -0.18, 0.08);
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	//包上那个横线
	glBegin(GL_LINES);
	glVertex2f(-0.09, -0.18);
	glVertex2f(0.09, -0.18);
	glEnd();
	
	//肚皮
	glBegin(GL_LINES);
	glVertex2f(-0.15, -0.3);
	glVertex2f(0.15, -0.3);

	glVertex2f(-0.15, -0.3);
	glVertex2f(-0.15, 0);

	glVertex2f(0.15, -0.3);
	glVertex2f(0.15, 0);
	glEnd();

	//给身体填充颜色
	glBegin(GL_TRIANGLE_FAN);
	glColor3f(ColorChoose[FACE_COLOR][0], ColorChoose[FACE_COLOR][1], ColorChoose[FACE_COLOR][2]);
	glVertex2f(-0.28, -0.40);
	glVertex2f(0.23, -0.40);
	glVertex2f(0.23, -0.3);
	glVertex2f(-0.28, -0.3);
	glVertex2f(-0.28, -0.40);
    glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(ColorChoose[FACE_COLOR][0], ColorChoose[FACE_COLOR][1], ColorChoose[FACE_COLOR][2]);
	glVertex2f(-0.28, -0.3);
	glVertex2f(-0.15, -0.3);
	glVertex2f(-0.15, 0);
	glVertex2f(-0.28, 0.1);
	glVertex2f(-0.28, -0.3);
	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(ColorChoose[FACE_COLOR][0], ColorChoose[FACE_COLOR][1], ColorChoose[FACE_COLOR][2]);
	glVertex2f(0.15, -0.3);
	glVertex2f(0.23, -0.3);
	glVertex2f(0.23,0.06);
	glVertex2f(0.15, 0);
	glVertex2f(0.15, -0.3);
	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(ColorChoose[FACE_COLOR][0], ColorChoose[FACE_COLOR][1], ColorChoose[FACE_COLOR][2]);
	glVertex2f(-0.28, -0.1);
	glVertex2f(-0.28, 0.1);
	glVertex2f(-0.4, 0.05);
	glVertex2f(-0.28, -0.1);
	glEnd();
	
	glBegin(GL_TRIANGLE_FAN);
	glColor3f(ColorChoose[FACE_COLOR][0], ColorChoose[FACE_COLOR][1], ColorChoose[FACE_COLOR][2]);
	glVertex2f(0.23, -0.16);
	glVertex2f(0.30, -0.06);
	glVertex2f(0.23, 0.06);
	glVertex2f(0.23, -0.16);
	glEnd();

	glBegin(GL_TRIANGLE_FAN);
	glColor3f(ColorChoose[FACE_COLOR][0], ColorChoose[FACE_COLOR][1], ColorChoose[FACE_COLOR][2]);
	glVertex2f(-0.3, 0.08);
	glVertex2f(-0.27, 0.1);
	glVertex2f(-0.32, 0.16);
	glVertex2f(-0.3, 0.08);
	glEnd();

}

//动态变颜色
void time(int v)
{
	if (r == 1.0f)
	{
		r = 0.0f;
		g = 1.0f;
	}
	else if (g == 1.0f)
	{
		g = 0.0f;
		b = 1.0f;
	}
	else
	{
		b = 0.0f;
		r = 1.0f;
	}
	if (fg % 2 == 0)
	{
		fg = 1;
		x = 390;
		y = 390;
	}
	else
	{
		fg = 0;
		x = 410;
		y = 410;
	}
	glutPostRedisplay();
	glutTimerFunc(100, time, 1);
}

//旋转角度控制
void spinDisplay(int value)
{
	spin = spin + 6;
	if (spin > 360.0)
	{
		spin = spin - 360.0;
	}
	glutPostRedisplay();
	glutTimerFunc(10, spinDisplay, 2);
}

//风车绘制
void windcar()
{
	//风车棒子
	glLineWidth(3);
	glColor3f(ColorChoose[LINE_COLOR][0], ColorChoose[LINE_COLOR][1], ColorChoose[LINE_COLOR][2]);
	glBegin(GL_LINES);
	glVertex2f(-0.4, 0.2);
	glVertex2f(-0.6, 0.5);
	glEnd();

	glPushMatrix();
	//把中心给移动了,这我居然还被难住了...
	glTranslatef(-0.6, 0.5f, 0.0f);
	glRotatef(spin,0.0, 0.0, 1.0);
	//glRotatef(spin, 0.0, 1.0, 0.0);
	glLineWidth(5.0f);
	glBegin(GL_LINES);
	glColor3f(1.0, 0.0, 0.0);
	//glRectf(-0.7, -0.3, 0.7, 0.3);
	glVertex3f(-0.1, -0.1, 0.0);
	glVertex3f(0.1, 0.1, 0.0);

	glColor3f(0.0, 1.0, 0.0);
	glVertex3f(0, -0.12, 0.0);
	glVertex3f(0, 0.12, 0.0);

	glColor3f(0.0, 0.0, 1.0);
	glVertex3f(0.1, -0.1, 0.0);
	glVertex3f(-0.1, 0.1, 0.0);
	glEnd();
	glPopMatrix();
}


void ini()
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glMatrixMode(GL_PROJECTION);
	glShadeModel(GL_FLAT);
	gluOrtho2D(0.0, 200.0, 0.0, 200.0);
}

void display()
{
	glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
	glClear(GL_COLOR_BUFFER_BIT);   //用当前背景色填充窗口
	

	//画脸 圆形 x,y,r
	face(0.0, 0.4, 0.4);
	//脸白色部分
	face1(0.0, 0.26, 0.3);
	//给脸描线
	drawline(0.0, 0.4, 0.4);
	//脸白部分描线
	drawline(0.0, 0.26, 0.3);

	//左眼
	eyes(-0.10, 0.63, 0.08);
	//右眼
	eyes(0.10, 0.63, 0.08);
	//左眼珠子
	eyeskernel(-0.06, 0.63, 0.03);
	//右眼珠子
	eyeskernel(0.06, 0.63, 0.03);
	//左右眼描线
	drawline(-0.10, 0.63, 0.08);
	drawline(0.10, 0.63, 0.08);


	//鼻子
	nose(0.0, 0.53, 0.06);
	//鼻子描线
	drawline(0.0, 0.53, 0.06);


	//嘴巴
	nosebeard();
	mouthhalf(0.0, 0.26, 0.2);
	//嘴巴描线 half!!!
	drawlinehalfmouth(0.0, 0.26, 0.2);


	//铃铛
	decorate(0.0, -0.1, 0.05);
	//铃铛描线
	drawline(0.0, -0.1, 0.05);
	
	//身子
	body();

	//风车
	windcar();
	
	glFlush();
}


int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE| GLUT_DEPTH);

	glutInitWindowPosition(100, 100);
	glutInitWindowSize(400, 400);
	glutCreateWindow("哆啦A梦");
	glutDisplayFunc(display);
	//glutReshapeFunc(reshape);
	//铃铛变颜色
	glutTimerFunc(100, time, 1);
	//风车旋转
	glutTimerFunc(10, spinDisplay, 2);
	glutMainLoop();
	return 0;
}



是一个有动画的但是我不会截取动图,下面有个静态的,填充不规则图元使用三角填充真的是很费时间啊。但是学到了一招下次可以把要搞的东西放在cs6里面应该就可以很好地找出坐标了

  • 11
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值