Opengl绘制花托(二)

来源:互联网 发布:金山毒霸数据恢复 编辑:程序博客网 时间:2024/04/30 19:39

二.绘制花托代码

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表示显示面,多边形采用填充形式 

原创粉丝点击