OpenGL---实例 球体 画圆锥

用OpenGL 的接口直接创出对应的实心球,圆锥体,圆环。效果如下:


OpenGL---实例 球体 画圆锥_第1张图片

头文件 

需要导入相应的GL 库:

OpenGL---实例 球体 画圆锥_第2张图片

可以根据“+” 增加  slices 以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴,类似于经线)stacks  围绕在Z轴周围的线的条数(类似于地球上纬线)

OpenGL---实例 球体 画圆锥_第3张图片

增加效果:

OpenGL---实例 球体 画圆锥_第4张图片

减少效果:

OpenGL---实例 球体 画圆锥_第5张图片

完整代码:

#include "stdafx.h"
#include "Windows.h"
#include "math.h"
#include "stdlib.h"
#include "gl/GL.h"
#include "gl/GLU.h"
#include "gl/glut.h"

static int slices = 16;
static int stacks = 16;

static void resize(int width, int height)
{
	const float ar = (float)width / (float)height;

	glViewport(0, 0, width, height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

static void display()
{
	const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
	const double a = t*90.0;

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3d(0, 1, 0);

	glPushMatrix();
	glTranslated(-2.4, 1.2, -6);
	glRotated(60, 1, 0, 0);
	glRotated(a, 0, 0, 1);
	glutSolidSphere(1, slices, stacks);//实心球
	glPopMatrix();

	glPushMatrix();
	glTranslated(0, 1.2, -6);
	glRotated(60, 1, 0, 0);
	glRotated(a, 0, 0, 1);
	glutSolidCone(1, 1, slices, stacks);//实心圆锥体
	glPopMatrix();

	glPushMatrix();
	glTranslated(2.4, 1.2, -6);
	glRotated(60, 1, 0, 0);
	glRotated(a, 0, 0, 1);
	glutSolidTorus(0.2, 0.8, slices, stacks);//实心圆环环
	glPopMatrix();

	glPushMatrix();
	glTranslated(-2.4, -1.2, -6);
	glRotated(60, 1, 0, 0);
	glRotated(a, 0, 0, 1);
	glutWireSphere(1, slices, stacks);//网格球体
	glPopMatrix();

	glPushMatrix();
	glTranslated(0, -1.2, -6);
	glRotated(60, 1, 0, 0);
	glRotated(a, 0, 0, 1);
	glutWireCone(1, 1, slices, stacks);//网格圆锥体
	glPopMatrix();

	glPushMatrix();
	glTranslated(2.4, -1.2, -6);
	glRotated(60, 1, 0, 0);
	glRotated(a, 0, 0, 1);
	glutWireTorus(0.2, 0.8, slices, stacks);//网格圆环
	glPopMatrix();

	glutSwapBuffers();
}


static void key(unsigned char key, int x, int y)
{
	switch (key)
	{
	case 27:
	case 'q':
		exit(0);
		break;

	case '+':
		slices++;
		stacks++;
		break;

	case '-':
		if (slices>3 && stacks>3)
		{
			slices--;
			stacks--;
		}
		break;
	}

	glutPostRedisplay();
}

static void idle()
{
	glutPostRedisplay();
}

const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/**//* Program entry point */

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitWindowSize(640, 480);
	glutInitWindowPosition(10, 10);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

	glutCreateWindow("FreeGLUT Shapes");

	glutReshapeFunc(resize);
	glutDisplayFunc(display);
	glutKeyboardFunc(key);
	glutIdleFunc(idle);

	glClearColor(1, 1, 1, 1);
	glEnable(GL_CULL_FACE);
	glCullFace(GL_BACK);

	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LESS);

	glEnable(GL_LIGHT0);
	glEnable(GL_NORMALIZE);
	glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_LIGHTING);

	glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
	glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
	glLightfv(GL_LIGHT0, GL_POSITION, light_position);

	glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

	glutMainLoop();

	return EXIT_SUCCESS;
}


你可能感兴趣的:(计算机图形学,OpenGL,渲染和计算机图形学)