1.绘制目标
- 理解物体坐标系、世界坐标系以及两者之间的关系,尝试使用glTranslate*()函数进行模型变换。
- 学会使用GL_TRIANGLE_STRIP绘制二维实体。
2.核心代码
2.1 坐标轴
void Draw_cross(double x, double y)
{
glColor3f(0.f, 0.f, 0.f);
glBegin(GL_LINES);
glVertex2f(-8.0f - x, 0.0f - y);
glVertex2f(8.0f - x, 0.0f - y);
glVertex2f(0.0f - x, 8.0f - y);
glVertex2f(0.0f - x, 0.0f - y);
glVertex2f(7.7f - x, 0.3f - y);
glVertex2f(8.0f - x, 0.0f - y);
glVertex2f(7.7f - x, -0.3f - y);
glVertex2f(8.0f - x, 0.0f - y);
glVertex2f(-0.2f - x, 7.5f - y);
glVertex2f(0.0f - x, 8.0f - y);
glVertex2f(0.2f - x, 7.5f - y);
glVertex2f(0.0f - x, 8.0f - y);
glEnd();
}
2.2 彩色矩形
void Draw_block(double x, double y, double width, double height, double R, double G, double B)
{
glColor3f(R, G, B);
glPointSize(1.f);
glBegin(GL_TRIANGLE_STRIP);
glVertex2f(x, y);
glVertex2f(x, y - height);
glVertex2f(x + width, y);
glVertex2f(x + width, y - height);
glEnd();
}
3.全部代码
#define GLEW_STATIC
#define FREEGLUT_STATIC
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <GL/glext.h>
#include <iostream>
#include "main.h"
void init() {
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void Draw_cross(double x , double y)
{
glColor3f(0.f, 0.f, 0.f);
glBegin(GL_LINES);
glVertex2f(-8.0f - x, 0.0f - y);
glVertex2f(8.0f - x, 0.0f - y);
glVertex2f(0.0f - x, 8.0f - y);
glVertex2f(0.0f - x, 0.0f - y);
glVertex2f(7.7f - x, 0.3f - y);
glVertex2f(8.0f - x, 0.0f - y);
glVertex2f(7.7f - x, -0.3f - y);
glVertex2f(8.0f - x, 0.0f - y);
glVertex2f(-0.2f - x, 7.5f - y);
glVertex2f(0.0f - x, 8.0f - y);
glVertex2f(0.2f - x, 7.5f - y);
glVertex2f(0.0f - x, 8.0f - y);
glEnd();
}
void Draw_block(double x, double y, double width, double height , double R, double G, double B)
{
glColor3f(R, G, B);
glPointSize(1.f);
glBegin(GL_TRIANGLE_STRIP);
glVertex2f(x, y);
glVertex2f(x, y - height);
glVertex2f(x + width, y);
glVertex2f(x + width, y - height);
glEnd();
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
Draw_cross(0.5, 0);
Draw_block(-5.0, 1.2, 1.0, 1.2, 0.5, 0.5, 0.5);
Draw_block(-3.0, 3.0, 1.0, 3.0, 1, 0, 1);
Draw_block(-1.0, 5.6, 1.0, 5.6, 1, 0, 0);
Draw_block(1.0, 6.7, 1.0, 6.7, 0, 1, 0);
Draw_block(3.0, 4.7, 1.0, 4.7, 0, 0, 1);
Draw_block(5.0, -1.5, 1.0, -1.5, 0.4, 0.8, 0.2);
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-8.f, 8.f, -8.f, 8.f);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitContextVersion(3, 3);
glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(0, 0);
glutInitWindowSize(800, 600);
glutCreateWindow("HellGL");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glewExperimental = GL_TRUE;
glewInit();
init();
glutMainLoop();
return 0;
}
4.运行结果