每天一个OpenGL程序 第四篇 三角形的绘制

#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
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值