欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenGL---实例 球体 画圆锥

程序员文章站 2022-05-21 09:34:15
...

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


OpenGL---实例 球体 画圆锥

头文件 

需要导入相应的GL 库:

OpenGL---实例 球体 画圆锥

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

OpenGL---实例 球体 画圆锥

增加效果:

OpenGL---实例 球体 画圆锥

减少效果:

OpenGL---实例 球体 画圆锥

完整代码:

#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;
}