#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
/* 练习4.1
* 三角形的绘制,立体圆锥绘制
*/
//声明一个显示函数
void ghRender(void);
//声明一个初始化函数
void ghInitGL(void);
//屏幕宽高
int winWidth = 640;
int winHeight = 480;
//定义常量PI
#define GH_PI 3.1415926f
int main(int argc,char ** argv)
{
//初始化glut库
glutInit(&argc,argv);
//初始化显示模式
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
//初始化窗口大小
glutInitWindowSize(winWidth,winHeight);
//初始化窗口位置
glutInitWindowPosition(100,150);
//初始化窗口
glutCreateWindow("圆锥的绘制");
//注册显示回调函数
glutDisplayFunc(ghRender);
//初始化函数
ghInitGL();
//进入循环等待时间
glutMainLoop();
return 0;
}
void ghInitGL(void)
{
//黑色背景
glClearColor(0,0,0,1);
//画笔为绿色
glColor3f(0,1,0);
//设定着色模式
glShadeModel(GL_FLAT);
//指定顺时针绕为正面
glFrontFace(GL_CW);
GLfloat nRange = 100.0f;
glViewport(0,0,winWidth,winHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-nRange * winWidth/winHeight,nRange * winWidth/winHeight,-nRange,nRange,-nRange,nRange);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
/*
重要API
1、glShadeModel (GLenum mode)
设定着色模式
参数:
mode 可以取以下值
GL_FLAT 恒定着色,取某个顶点的颜色 填充多边形
GL_SMOOTH 光滑着色,线条颜色由线段端点颜色插值得出
2、glFrontFace(GLenum mode);
设定哪种绕法为正面
参数:
mode 可以取以下的值
GL_CW 顺时针
GL_CCW 逆时针
绕法:
指定顶点的顺序和方向 称为绕法
v1 v1
/ * * \
/ \ / \
* \ / *
v2 -- * v3 v3 * -- v2
以上为两种不同的绕法
*/
float xRot = 0,yRot = xRot = 300;
void ghRender(void)
{
GLfloat x,y,angle;
GLfloat r = 50.0f;
bool flag = false;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(xRot,1,0,0);
glRotatef(yRot,0,1,0);
//画顶面
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0,0,75.0f);
for (angle = 0.0f ; angle < (2.0f* GH_PI); angle += (GH_PI/8.0f))
{
x = r * sin(angle);
y = r * cos(angle);
if(flag)
{
glColor3f(0,1,0);
}
else
{
glColor3f(1,0,0);
}
flag = !flag;
glVertex2f(x,y);
}
glEnd();
//画底面
glBegin(GL_TRIANGLE_FAN);
for (angle = 0.0f ; angle < (2.0f* GH_PI); angle += (GH_PI/8.0f))
{
x = r * sin(angle);
y = r * cos(angle);
glColor3f(0,0,1);
flag = !flag;
glVertex2f(x,y);
}
glEnd();
glPopMatrix();
glFlush();
}
/*
画三角形的三种模式
1、GL_TRIANGLES
每三个点为一组,构成三角形,一组中,不够三个点或不能构成三角形,不进行绘制
比如六个点P0,P1,P2,P3,P4,P5 就构成{P0,P1,P2}、{P3,P4,P5}两个三角形
如果是四个点P0,P1,P2,P3 只能构成一个三角形{P0,P1,P2}
三角形个数 = 取整(顶点数/3)
2、GL_TRIANGLE_STRIP
取新的点和上两个点组成三角形
比如六个点P0,P1,P2,P3,P4,P5 就构成{P0,P1,P2}、{P1,P2,P3}、{P2,P3,P4}、{P3,P4,P5}四个三角
三角形个数 = 顶点数-2
3、GL_TRIANGLE_FAN
取新的点和上一个点以及最初的一个点
比如六个点P0,P1,P2,P3,P4,P5 就构成{P0,P1,P2}、{P0,P2,P3}、{P0,P3,P4}、{P0,P4,P5}四个三角
三角形个数 = 顶点数-2
*/