二.绘制花托代码
1.使用闭合折线GL_LINE_LOOP绘制花托
#include "stdafx.h"
#include "GL/glut.h"
#include "math.h"
#define PI 3.1415926
static GLfloat yRot=30.0f;
GLint nNumMajor=80,nNumMinor=40;//采样点的数目
GLfloat fstepMajor=2*PI/nNumMajor;//大圆旋转步长
GLfloat fstepMinor=2*PI/nNumMinor;//小圆旋转步长
GLfloat fAngleMajor=0.0f;//大圆旋转角度
GLfloat fAngleMinor=0.0f;//小圆旋转角度
GLfloat x=0.0f,y=0.0f,z=0.0f;//空间一个顶点的坐标
GLfloat R=5.0f,r=2.0f;//大圆小圆半径
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清楚颜色深度缓冲区
glPushMatrix();//入栈
glTranslatef(0.0f,0.0f,-25.0f);//使球体往屏幕里面平移
glRotatef(yRot,0.0f,1.0f,1.0f);//旋转
for(fAngleMajor=0.0f;fAngleMajor<=2*PI;fAngleMajor+=fstepMajor)
{
glBegin(GL_LINE_LOOP);
for(fAngleMinor=0.0f;fAngleMinor<=2*PI;fAngleMinor+=fstepMinor)
{
x=(r*cos(fAngleMinor)+R)*cos(fAngleMajor);
y=(r*cos(fAngleMinor)+R)*sin(fAngleMajor);
z=r*sin(fAngleMinor);
glVertex3f(x,y,z);
}
glEnd();
}
glPopMatrix();
glutSwapBuffers();
}
void SetupRC()
{
glClearColor(0.0f,0.0f,1.0f,1.0f);//设置屏幕背景色为蓝色
glColor3f(1.0f,1.0f,1.0f);//设置图形颜色为白色
glEnable(GL_DEPTH_TEST);//开启深度测试功能
glEnable(GL_SMOOTH);
}
void ChangeSize(int w,int h)
{
GLfloat fAspect=(float)w/(float)h;
if(h==0)
h=1;
//设立视口到窗口之间的范围
glViewport(0,0,w,h);
//重设投影矩阵
glMatrixMode(GL_PROJECTION);//声明对投影矩阵进行操作
glLoadIdentity();//更新
//正交投影变换
gluPerspective(45.0,fAspect,1.0,100.0);
glMatrixMode(GL_MODELVIEW);//声明对模型视景矩阵进行操作
glLoadIdentity();
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);//初始化glut库
glutInitWindowSize(800,600);//设置窗口大小
glutCreateWindow("huatuo");
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);//设置图形显示模式
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
glutMainLoop();
return 0;
}
2.使用GL_TRAINGLE_STRIP 线型连续填充三角形串绘制花托
#include "stdafx.h"
#include "GL\glut.h"
#include "math.h"
#define PI 3.1415926
static GLfloat yRot=3.0f;
GLint nNumMajor=80,nNumMinor=40;//采样点的数目
GLfloat fstepMajor=2*PI/nNumMajor;//大圆旋转步长
GLfloat fstepMinor=2*PI/nNumMinor;//小圆旋转步长
GLfloat fAngleMajor1=0.0f,fAngleMajor2=0.0f;//大圆旋转角度
GLfloat fAngleMinor=2.0f;//小圆旋转角度
GLfloat vx1=0.0f,vy1=0.0f,vz1=0.0f,vx2=0.0f,vy2=0.0f,vz2=0.0f;//空间三角带的两个坐标
GLfloat R=5.0f,r=2.0f;//大圆小圆半径
void SetupRC()
{
glClearColor(0.0f,0.0f,1.0f,1.0f);//设置屏幕背景色为蓝色
glColor3f(1.0f,1.0f,1.0f);//设置图形颜色为白色
glEnable(GL_DEPTH_TEST);//开启深度测试功能
glEnable(GL_SMOOTH);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清楚颜色深度缓冲区
glPushMatrix();//入栈
glTranslatef(0.0f,0.0f,-25.0f);//使球体往屏幕里面平移
glRotatef(yRot,0.0f,1.0f,1.0f);//旋转
for(fAngleMajor1=0.0f;fAngleMajor1<=2*PI;fAngleMajor1+=fstepMajor)
{
fAngleMajor2=fAngleMajor1+fstepMajor;//大圆下一个采样点
glBegin(GL_TRIANGLE_STRIP);
for(fAngleMinor=0.0f;fAngleMinor<=2*PI+fstepMinor;fAngleMinor+=fstepMinor)
//上限值2*PI+fstepMinor否则会有一个裂痕
{
vx1=(r*cos(fAngleMinor)+R)*cos(fAngleMajor1);
vy1=(r*cos(fAngleMinor)+R)*sin(fAngleMajor1);
vz1=r*sin(fAngleMinor);
vx2=(r*cos(fAngleMinor)+R)*cos(fAngleMajor2);
vy2=(r*cos(fAngleMinor)+R)*sin(fAngleMajor2);
vz2=r*sin(fAngleMinor);
glVertex3f(vx1,vy1,vz1);
glVertex3f(vx2,vy2,vz2);
}
glEnd();
}
glPopMatrix();
glutSwapBuffers();
}
void ChangeSize(int w,int h)
{
GLfloat fAspect=(float)w/(float)h;
if(h==0)
h=1;
//设立视口到窗口之间的范围
glViewport(0,0,w,h);
//重设投影矩阵
glMatrixMode(GL_PROJECTION);//声明对投影矩阵进行操作
glLoadIdentity();//更新
//正交投影变换
gluPerspective(45.0,fAspect,1.0,100.0);
glMatrixMode(GL_MODELVIEW);//声明对模型视景矩阵进行操作
glLoadIdentity();
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);//初始化glut库
glutInitWindowSize(800,600);//设置窗口大小
glutCreateWindow("huatuo1");
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);//设置图形显示模式
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
//glutTimerFunc(10,TimerFunc,1);
SetupRC();
glutMainLoop();
return 0;
}
其中需要解释的是用三角带绘制花托,在外循环中要一次采样两个点。
还有次代码中有一个函数在此学习一下:
glPolygonMode函数,其功能是用于控制多边形的显示方式
其原型是:void glPolygonMode(GLenum face,GLenum mode);
参数face是确定显示模式将适用于物体的哪些部分,控制多边形的正面和背面的
绘图模式:
GL_FRONT表示显示模式将适用于物体的前向面(也就是物体能看到的面)
GL_BACK表示显示模式将适用于物体的后向面(也就是物体上不能看到的面)
GL_FRONT_AND_BACK表示显示模式将适用于物体的所有面
mode是确定选中物体的面以何种方式显示(显示模式):
GL_POINT表示只显示顶点,多边形用点显示
GL_LINE表示显示线段,多边形用轮廓显示
L_FILL表示显示面,多边形采用填充形式