#include "Dependencies\glew\glew.h"
#include "Dependencies\freeglut\freeglut.h"
#include
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0); //窗口颜色(红:[0.0~1.0]R, 绿:[0.0~1.0]G,蓝:[0.0~1.0]B, 透明度:[0.0~1.0]A)
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-5.0,5.0,-5.0,5.0);
glMatrixMode(GL_MODELVIEW); /*使用正投影将世界坐标系二位矩形区域的内容映射到屏幕上,区域的x坐标值从0.0到200.0,y坐标值从0.0到150.0*/
//glShadeModel(GLU_SMOOTH);
}
void drawSqure(void)
{
glBegin(GL_POLYGON);
glVertex2f(-1.0f, -1.0f);
glVertex2f(1.0f, -1.0f);
glVertex2f(1.0f, 1.0f);
glVertex2f(-1.0f, 1.0f);
glEnd();
}
void mydraw(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glTranslatef(0.0f,2.0f,0.0f);
glScalef(3.0, 0.5, 1.0);
glColor3f(1.0, 0.0, 0.0);
drawSqure();
glPopMatrix();
glPushMatrix();
glTranslatef(-3.0, 0.0, 0.0);
glPushMatrix();
glRotatef(45.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 1.0, 0.0);
drawSqure();
glPopMatrix();
glTranslatef(3.0, 0.0, 0.0);
glPushMatrix();
glRotatef(45.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 0.7, 0.0);
drawSqure();
glPopMatrix();
glTranslatef(3.0, 0.0, 0.0);
glPushMatrix();
glRotatef(45.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 0.4, 0.0);
drawSqure();
glPopMatrix();
glPopMatrix();
glTranslatef(0.0, -3.0, 0.0);
glScalef(4.0, 1.5, 1.0);
glColor3f(0.0, 0.0, 1.0);
drawSqure();
glFlush();
}
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
void lineSegment(void)
{
glClear(GL_COLOR_BUFFER_BIT);//GL_COLOR_BUFFER_BIT是一个OpenGL符号常量,用来指定它的颜色缓存(刷新缓存)中的位值
glColor3f(1.0f, 1.0f, 0.0f);//设置线段颜色为红色
glBegin(GL_POINTS);
//MidPLine(0, 0, 200,100,20);
glEnd();
glFlush(); //执行所有的OpenGL程序
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);//初始化GULT
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示模式
glutInitWindowPosition(0, 0);//设置左上角窗口显示位置
glutInitWindowSize(600, 600);//设置窗口显示的宽与高
glutCreateWindow("An Example OpenGL Program!");//创建一个窗口
init();//执行初始化程序
glutDisplayFunc(mydraw);
//glutDisplayFunc(lineSegment);//把图形显示在窗口
//glutReshapeFunc(reshape);
glutMainLoop();//显示所有并进入等待状态
return 0;
}
要求画一个菱形,然后通过几何变换来画出一个三菱标志,关键是理解glPushMatrix()
和glPopMatrix()
函数的作用,相当于自动初始化了一个封装好的堆栈,用来存放我们画面的单位矩阵。
glPushMatrix()
就是把我们最近一次画出来的单位矩阵保存,保存变换后的坐标系。
glPopMatrix()
就是读取我们最近一次保存的坐标系
理解好这一点之后,画这个三菱图形其实根本不用计算坐标。因为如果我们想先画一个菱形,然后直接旋转的话,就不用glPopMatrix()
读取之前保存的坐标系,接着往下旋转即可。
#include "Dependencies\glew\glew.h"
#include "Dependencies\freeglut\freeglut.h"
#include
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0); //窗口颜色(红:[0.0~1.0]R, 绿:[0.0~1.0]G,蓝:[0.0~1.0]B, 透明度:[0.0~1.0]A)
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW); /*使用正投影将世界坐标系二位矩形区域的内容映射到屏幕上,区域的x坐标值从0.0到200.0,y坐标值从0.0到150.0*/
//glShadeModel(GLU_SMOOTH);
}
void drawSqure(void)
{
glBegin(GL_POLYGON);
glVertex2f(0.0f, 0.0f);
glVertex2f(2.0f, 0.0f);
glVertex2f(3.0f, sqrt(3));
glVertex2f(1.0f, sqrt(3));
glEnd();
}
void mydraw(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glRotatef(60.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 1.0, 0.0);
drawSqure();
glPushMatrix();
glRotatef(120.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 0.7, 0.0);
drawSqure();
glPushMatrix();
glRotatef(120.0, 0.0, 0.0, 1.0);
glColor3f(0.0, 0.4, 0.0);
drawSqure();
glPopMatrix();
glFlush();
}
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);//初始化GULT
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//设置显示模式
glutInitWindowPosition(0, 0);//设置左上角窗口显示位置
glutInitWindowSize(600, 600);//设置窗口显示的宽与高
glutCreateWindow("An Example OpenGL Program!");//创建一个窗口
init();//执行初始化程序
glutDisplayFunc(mydraw);
glutMainLoop();//显示所有并进入等待状态
return 0;
}