球形的绘制
一、函数解释
glClearDepth 深度函数,用于实现实心物体的遮挡。
glShadeModel 为上色模式。是使用GL_FLAT还是GL_SMOOTH
glEnable 启用了光照功能
glLightfv 创建光源函数(这里使用了多个光源)
glOrtho 屏幕截取函数.只是负责使用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上。就是无论你怎样截取它都显示该有的样子--比如装不下那么就显示不部分.
glRotatef 将图形进行旋转的函数.第一个是参数为angle,第二个参数为x,第三个参数为y,第四个参数为z,这里是绕着y轴旋转.
glMaterialfv 决定了材料。其中第一个为使用于物体的正面还是反面。Pname 指的是材质的属性param为要设置的属性值指向了一个数组
glutSolidSphere 画个球,5.0代表着半径,30为以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴,类似于经线),30是围绕在Z轴周围的线的条数
二、代码实现
#include <windows.h>
#include <gl/GL.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <cstdlib>
const GLfloat lightPosition[] = { 10.0, 10.0, 10.0, 0.0 };
const GLfloat whiteLight[] = { 0.8, 0.8, 0.8, 1.0 };
GLfloat matSpecular[] = { 0.3, 0.3, 0.3, 1.0 };
GLfloat matShininess[] = { 20.0 };
GLfloat matEmission[] = { 0.3, 0.3, 0.3, 1.0 };
GLfloat spin = 0;
void init()
{
glClearColor(0.3, 0.3, 0.3, 1.0);
glClearDepth(1.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);//启用光照功能
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);//创建多个光源
glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteLight);//
glLightfv(GL_LIGHT0, GL_SPECULAR, whiteLight);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();;
glOrtho(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0); //glOrtho函数只是负责使用什么样的视景体来截取图像,并不负责使用某种规则把图像呈现在屏幕上。就是无论你怎样截取它都显示该有的样子--比如装不下那么就显示不部分
glMatrixMode(GL_MODELVIEW);//初始化
glPushMatrix();
glRotatef(spin, 0.0, 1.0, 0.0);//旋转的函数,第一个是参数为angle,第二个参数为x,第三个参数为y,第四个参数为z,这里是绕着y轴旋转
glMaterialfv(GL_FRONT, GL_SPECULAR, matSpecular);
glMaterialfv(GL_FRONT, GL_SHININESS, matShininess);
glMaterialfv(GL_FRONT, GL_EMISSION, matEmission);
glutSolidSphere(5.0, 30, 30);//画个球,5.0代表着半径,30为以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴,类似于经线),30是围绕在Z轴周围的线的条数
glPopMatrix(); //配对使用可以消除上一次的变换对本次变换的影响
glFlush();
}
void reshape(int w, int h)
{
glViewport(0.0, 0.0, (GLsizei)w, (GLsizei)h);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(450, 450);
glutInitWindowPosition(150, 150);
glutCreateWindow("rotate sphere");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
init();
glutMainLoop();
return EXIT_SUCCESS;
}
三、实现结果