#include <stdio.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include <gl/glut.h>
#include <ctime>
#include <cmath>
#define GRAVITY -9.8f
const int Interval = 16;
GLfloat AngleX;
GLfloat AngleY;
float animateTime;
float animateTimeX;
float animateRotation; // variable to track the current amount of rotation steps
float animateTranslation;
GLfloat COLORS[6][3] = {
{ 1.0f, 0.0f, 0.0f },
{ 1.0f, 1.0f, 0.0f },
{ 0.0f, 1.0f, 0.0f },
{ 0.0f, 1.0f, 1.0f },
{ 0.0f, 0.0f, 1.0f },
{ 1.0f, 0.0f, 1.0f },
};
void cylinder(float radius, float height)
{
GLUquadricObj *state = gluNewQuadric();
glPushMatrix();
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);//这里和下面哪个,旋转-90度,是因为模型是z轴为主轴的,旋转到y轴。
gluCylinder(state, radius, radius, height, 32, 32);
glPopMatrix();
gluDeleteQuadric(state);
}
void pipe(float radius, float a1, float a2)
{
GLUquadricObj *state = gluNewQuadric();
glPushMatrix();
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
gluPartialDisk(state, 0.0f, radius, 32, 32, a1, a2);
glPopMatrix();
gluDeleteQuadric(state);
}
void drawobj(float size)
{
glPushMatrix();
//左右两个杆
glPushMatrix();
glTranslatef(size * 0.75f, 0.0f, size * 0.125f);
cylinder(size * 0.025f, size * 0.65f);
//加个转接口圆,看着圆润
glTranslatef(0.0f, size * 0.65f, 0.0f);
glutSolidSphere(size * 0.025f, 16, 16);
glPopMatrix();
glPushMatrix();
glTranslatef(size * 0.75f, 0.0f, size * -0.125f);
cylinder(size * 0.025f, size * 0.65f);
//加个转接口圆,看着圆润
glTranslatef(0.0f, size * 0.65f, 0.0f);
glutSolidSphere(size * 0.025f, 16, 16);
glPopMatrix();
//横杠
glPushMatrix();
glTranslatef(size * 0.75f, size * 0.65f, 0.0f);
glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
glTranslatef(0.0f, -size * 0.125f, 0.0f);
cylinder(size * 0.025f, size * 0.25f);
glPopMatrix();
//和顶端链接
glPushMatrix();
glTranslatef(0.0f, size * 1.0f, 0.0f);
glRotatef(-115.0f, 0.0f, 0.0f, 1.0f);
cylinder(size * 0.0125f, size * 0.85f);
glPopMatrix();
//画个圈
/*glPushMatrix();
glTranslatef(size * 0.75f, 0.75f, 0.0f);
glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
glutSolidTorus(0.05f, 0.25f, 32, 32);
glPopMatrix();*/
glPopMatrix();
}
void init()
{
AngleX =25.0f;
AngleY = 0.0f;
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_DEPTH_TEST);
//glEnable(GL_DITHER);
glShadeModel(GL_SMOOTH);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//返回模型矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
const float size = 1.0f;
// 全局摄像机视觉
glTranslatef(0.0f, -size / 2.0f, 0.0f);
glRotatef(AngleX, 1.0f, 0.0f, 0.0f);
glRotatef(AngleY, 0.0f, 1.0f, 0.0f);
//底盘
glColor3f(1.0f, 1.0f, 1.0f);
cylinder(size, 0.1f);
//中间的杆
glColor3f(0.5f, 0.5f, 1.0f);
cylinder(0.05f, size);
//顶端球
glColor3f(1.0f, 1.0f, 1.0f);
glPushMatrix();
glTranslatef(0.0f, size, 0.0f);
glutSolidSphere(size * 0.08, 16, 16);
glPopMatrix();
//色盘
glPushMatrix();
glTranslatef(0.0f, 0.1f, 0.0f);
for (int i = 0; i < 6; ++i) {
glColor3fv(COLORS[i]);
pipe(size, i * 60, 60);
}
glPopMatrix();
//物品
for (int i = 0; i < 6; ++i) {
glColor3fv(COLORS[(i + 4) % 6]);
//每60度画一个
glPushMatrix();
glRotatef(60.0f * i, 0.0f, 1.0f, 0.0f);
drawobj(size);
glPopMatrix();
}
glutSwapBuffers();
}
void reshape(int w, int h)
{
GLfloat aspect = (GLfloat) w / (GLfloat) h;
GLfloat nRange = 2.0f;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h) {
glOrtho(-nRange, nRange, -nRange * aspect, nRange * aspect, -nRange, nRange);
}
else {
glOrtho(-nRange, nRange, -nRange / aspect, nRange / aspect, -nRange, nRange);
}
}
//计时器事件
void timer(int n)
{
//计时器设置的是 Interval 毫秒一次,7秒一圈的算法:
float t = Interval / 1000.0f;//每次执行多少秒
t *= 360.0f;//一圈多少秒
t /= 7.0f;
AngleY += t;
//刷新界面
glutPostRedisplay();
glutTimerFunc(Interval, timer, 0);
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL Cube");
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutTimerFunc(Interval, timer, 0);
glutMainLoop();
return 0;
}
程序运行结果: