Assignment 2 使用OpenGL画安卓机器人

一. 实现简述

Assignment 2 Report

目标:画一个安卓机器人。

代码结构:在 glutDisplayFunc(drawRobot)中的参数 drawRobot 函数是实 现画机器人的最外层函数,其中包括画脸、画身体、画手和画脚。每个函数又继 续细分画的步骤和方法。如下图所示:

二. 心得体会
这次任务让我对 OpenGl 有了初步认识。通过阅读课本和网上的资料,掌握

使用 OpenGl 的基本功能,比如如何画基本的点、线和多边形。并理解了一些之
前没明白的重要概念,比如 glLoadIdentity 和 glPushMatrix、glPopMatrix 的区
别。根据我现在的理解,glLoadIdentity 是将矩阵堆栈中栈顶的矩阵置为单位矩
阵,相当于坐标原点回到一开始的设置,也就忽略了之前平移、旋转等导致坐标
原点位置的改变。而 glPushMaxtrix 和 glPopMatrix 则是用于将当前矩阵压入栈
中,然后执行一些变换,这些变换是基于之前已经变换过的坐标,最后再出栈,
回到入栈前的坐标。

接下来我将继续学习 OpenGL 更多强大的功能。

代码如下:

#include <gl/glut.h>
#include <math.h>

int i;
const GLfloat PI = 3.1415926536f;
const int n = 1000;
const GLfloat eyeR = 0.025f; //radius of eye
const GLfloat faceR = 0.3f; //radius of face
const GLfloat bodyR = 0.05f; //radius of the corner of body
const GLfloat limbR = 0.06f; //radius of limb in both ends

void drawLimb(void) {
    //draw a half circle at one end
    glBegin(GL_POLYGON);
    for (i = 0; i < n; i++) {
        glVertex2f(limbR * cos(2 * PI / n * i), limbR * sin(2 * PI / n * i));
    }
    glEnd();

    //draw a rectangle
    glTranslatef(-0.06f, 0.0f, 0.0f);
    glRectf(0.0f, 0.0f, 0.12f, -0.3f);
    glEnd();

    //draw a half circle at the other end
    glTranslatef(0.06f, -0.3f, 0.0f);
    glBegin(GL_POLYGON);
    for (i = 0; i < n; i++) {
        glVertex2f(limbR * cos(2 * PI / n * i), limbR * sin(2 * PI / n * i));
    }
    glEnd();
    glFlush();
}

void drawHands(void)
{
    glLoadIdentity();
    glTranslatef(-0.38f, 0.2f, 0.0f);
    drawLimb();

    glLoadIdentity();
    glTranslatef(0.38f, 0.2f, 0.0f);
    drawLimb();
}

void drawBody(void)
{
    glLoadIdentity();

    //draw a rectangle first
    glTranslatef(-0.3f, 0.25f, 0.0f);
    glRectf(0.0f, 0.0f, 0.6f, -0.45f);
    glEnd();

    //draw a half circle at the left bottom
    glTranslatef(0.05f, -0.45f, 0.0f);
    glBegin(GL_POLYGON);
    for (i = 0; i < n; i++) {
        if (sin(2 * PI / n * i) < 0) {
            glVertex2f(bodyR * cos(2 * PI / n * i), bodyR * sin(2 * PI / n * i));
        }
    }
    glEnd();

    //draw a half circle at the right bottom
    glTranslatef(0.5f, 0.0f, 0.0f);
    glBegin(GL_POLYGON);
    for (i = 0; i < n; i++) {
        if (sin(2 * PI / n * i) < 0) {
            glVertex2f(bodyR * cos(2 * PI / n * i), bodyR * sin(2 * PI / n * i));
        }
    }
    glEnd();

    //draw the bottom rectangle
    glRectf(0.0f, 0.0f, -0.5f, -0.05f);
    glEnd();

    glFlush();
}

void drawLegs(void)
{
    glLoadIdentity();
    glTranslatef(-0.11f, -0.08f, 0.0f);
    drawLimb();

    glLoadIdentity();
    glTranslatef(0.11f, -0.08f, 0.0f);
    drawLimb();

}

void drawLine(void) {
    glLineWidth(5.0f);

    glBegin(GL_LINES);
    glVertex2f(0.0f, 0.0f);
    glVertex2f(0.0f, 0.15f);
    glEnd();

    glFlush();
}

void drawEye(void) {
    glColor3f(1.0f, 1.0f, 1.0f);
    glBegin(GL_POLYGON);
    for (i = 0; i < n; i++) {
        glVertex2f(eyeR * cos(2 * PI / n * i), eyeR * sin(2 * PI / n * i));
    }
    glEnd();
    glColor3ub(164, 202, 57);

    glFlush();
}

void drawFaceShape(void) {
    glBegin(GL_POLYGON);

    for (i = 0; i < n; i++) {
        if (sin(2 * PI / n * i) >= 0) {
            glVertex2f(faceR * cos(2 * PI / n * i), faceR * sin(2 * PI / n * i));
        }
    }
    glEnd();
    glFlush();
}

void drawFace(void)
{
    glLoadIdentity();
    glTranslatef(0.0f, 0.27f, 0.0f);
    drawFaceShape();//draw the overall shape of face

    //draw left eye
    glLoadIdentity();
    glTranslatef(-0.13f, 0.42f, 0.0f);
    drawEye();

    //draw right eye
    glLoadIdentity();
    glTranslatef(0.13f, 0.42f, 0.0f);
    drawEye();

    //draw left line
    glLoadIdentity();
    glTranslatef(-0.13f, 0.5f, 0.0f);
    glRotated(30.0f, 0.0f, 0.0f, 1.0f);
    drawLine();

    //draw right line
    glLoadIdentity();
    glTranslatef(0.13f, 0.5f, 0.0f);
    glRotated(-30.0f, 0.0f, 0.0f, 1.0f);
    drawLine();

}

void drawRobot(void)
{
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);//set background color to white
    glClear(GL_COLOR_BUFFER_BIT);

    glLoadIdentity();
    glColor3ub(164, 202, 57);//color of robot

    drawFace();
    drawBody();
    drawHands();
    drawLegs();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("Android Robot");
    glutDisplayFunc(drawRobot);
    glutMainLoop();

    return 0;
}
时间: 04-22

Assignment 2 使用OpenGL画安卓机器人的相关文章

CSS制作安卓机器人

<p>安卓机器人</p> <style><!-- /*整体*/ .robot{ width:400px; height:500px; margin:0px auto; } /*头部*/ .robot .head{ content:" "; width:200px; height:80px; margin:0px auto; background-Color:green; border-radius:90px 90px 0px 0px; } /*

Assignment 3 在OpenGL中使用Bresenham算法画圆

一.      任务目标 利用OpenGL,实现Bresenham算法画圆. 二.      任务要求 使用整数来确定点的位置. 标出圆心.(不太明白show的含义,于是我在圆心处画了一个点来表示.) 使用至少16个点表示一个圆. 三.      使用平台 Windows 8.1 Visual Studio 2012 四.      实现简述 与Bresenham直线算法类似,采用的是中点画圆算法. 定义圆的一个函数 可根据f(x, y)符号判断点(x, y)的位置: 于是假设点pi(xi, y

Android自定义View【实战教程】5??---Canvas详解及代码绘制安卓机器人

友情链接: Canvas API Android自定义View[实战教程]3??--Paint类.Path类以及PathEffect类详解 神马是Canvas 基本概念 Canvas:可以理解为是一个为我们提供了各种工具的画布,我们可以在上面尽情的绘制(旋转,平移,缩放等等).可以理解为系统分配给我们一个一个内存空间,然后提供了一些对这个内存空间操作的方法(API), 实际存储是在下面的bitmap. 两种画布 这里canvas可以绘制两种类型的画图,分别是view和surfaceView. V

OpenGL画圆

中点画圆 1 #include<gl/glut.h> 2 3 4 void MidPointCirle(int r) 5 { 6 int x,y; 7 float d; 8 x=0;y=r;d=1.25-r; 9 glColor3f(1.0f,1.0f,1.0f); 10 glVertex2i(x,y); 11 while(x<=y) 12 { 13 if(d<0) 14 d+=2*x+3; 15 else 16 { 17 d+=2*(x-y)+5; 18 y--; 19 } 20

安卓机器人实现

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> .box{ width: 300px; height: 300px; border: 1px solid red; background-color: rgb(183,226,219); margin: 1

安卓机器人

回来太晚了.做个头部就好了,先睡觉吧 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn"> &

【openGL】关于画点

#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math.h> #include <stdio.h> void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glPointSize(5.0f); //修改点的尺寸,默认大小为1.0f glBegin(GL_POINTS); glVertex2f(0

安卓 canvas

[转]http://blog.sina.com.cn/s/blog_61ef49250100qw9x.html(easy) [转]http://blog.csdn.net/rhljiayou/article/details/7212620 画了个Android 今晚瞎折腾,闲着没事画了个机器人——android,浪费了一个晚上的时间.画这丫还真不容易,为那些坐标,差点砸了键盘,好在最后画出个有模有样的,心稍安. 下面来看看画这么个机器人需要些什么东西:主要是Canvas类(android.gra

计算机图形学和OpenGL(二)坐标系和绘制点线函数

这节开始前我们先了解一下图元的概念.图形软件包中用来描述各种图形元素的函数称为图形输出原语,也称图元(primitive).而描述对象几何要素的输出图元一般称为几何图元.点和线是最简单的几何图元,本节就会简单介绍点和线段的绘制方法. 一.坐标系统. 坐标系统一般分为屏幕坐标和OpenGL中的绘图坐标. 在上一节中我们简单的写了个示例程序,程序中介绍了gluOrtho2D命令.我们可以利用该命令设定一个二维笛卡尔坐标系.该函数的四个变量制定的是显示图形x和y坐标范围.所以我们可以使用下面代码制定一