📄 glutmech.c
字号:
/*** program : glutmech V1.1* author : Simon Parkinson-Bates.* E-mail : sapb@yallara.cs.rmit.edu.au* Copyright Simon Parkinson-Bates.* "source if freely avaliable to anyone to copy as long as they* acknowledge me in their work."** Funtional features * ------------------* * online menu system avaliable by pressing left mouse button* * online cascading help system avaliable, providing information on* the several key strokes and what they do.* * animation sequence coded which makes the mech walk through an* environment. Shadows will soon be added to make it look* more realistic.* * menu control to view mech in wireframe or sold mode.* * various key strokes avaliable to control idependently the mechs* many joints.* * various key strokes avaliable to view mech and environment from * different angles* * various key strokes avaliable to alter positioning of the single* light source.*** Program features* ----------------* * uses double buffering* * uses display lists* * uses glut to manage windows, callbacks, and online menu.* * uses glpolygonfill() to maintain colors in wireframe and solid* mode.***//* start of compilation conditions */#define SPHERE#define COLOR#define LIGHT#define TORSO#define HIP#define SHOULDER#define UPPER_ARM#define LOWER_ARM#define ROCKET_POD#define UPPER_LEG#define LOWER_LEG#define NO_NORM#define ANIMATION#define DRAW_MECH#define DRAW_ENVIRO#define MOVE_LIGHT/* end of compilation conditions *//* start various header files needed */#include <stdlib.h>#include <math.h>#define GLUT#define GLUT_KEY#define GLUT_SPEC#include <GL/glut.h>/* end of header files *//* start of display list definitions */#define SOLID_MECH_TORSO 1#define SOLID_MECH_HIP 2#define SOLID_MECH_SHOULDER 3#define SOLID_MECH_UPPER_ARM 4#define SOLID_MECH_FOREARM 5#define SOLID_MECH_UPPER_LEG 6#define SOLID_MECH_FOOT 7#define SOLID_MECH_ROCKET 8#define SOLID_MECH_VULCAN 9#define SOLID_ENVIRO 10/* end of display list definitions *//* start of motion rate variables */#define ANKLE_RATE 3#define HEEL_RATE 3#define ROTATE_RATE 10#define TILT_RATE 10#define ELBOW_RATE 2#define SHOULDER_RATE 5#define LAT_RATE 5#define CANNON_RATE 40#define UPPER_LEG_RATE 3#define UPPER_LEG_RATE_GROIN 10#define LIGHT_TURN_RATE 10#define VIEW_TURN_RATE 10/* end of motion rate variables *//* start of motion variables *//* Some <math.h> files do not define M_PI... */#ifndef M_PI#define M_PI 3.14159265358979323846#endifGLUquadricObj *qobj;char leg = 0;int shoulder1 = 0, shoulder2 = 0, shoulder3 = 0, shoulder4 = 0, lat1 = 20, lat2 = 20, elbow1 = 0, elbow2 = 0, pivot = 0, tilt = 10, ankle1 = 0, ankle2 = 0, heel1 = 0, heel2 = 0, hip11 = 0, hip12 = 10, hip21 = 0, hip22 = 10, fire = 0, solid_part = 0, anim = 0, turn = 0, turn1 = 0, lightturn = 0, lightturn1 = 0;float elevation = 0.0, distance = 0.0, frame = 3.0 /* foot1v[] = {} foot2v[] = {} */ ;/* end of motion variables *//* start of material definitions */#ifdef LIGHTGLfloat mat_specular[] ={0.628281, 0.555802, 0.366065, 1.0};GLfloat mat_ambient[] ={0.24725, 0.1995, 0.0745, 1.0};GLfloat mat_diffuse[] ={0.75164, 0.60648, 0.22648, 1.0};GLfloat mat_shininess[] ={128.0 * 0.4};GLfloat mat_specular2[] ={0.508273, 0.508273, 0.508373};GLfloat mat_ambient2[] ={0.19225, 0.19225, 0.19225};GLfloat mat_diffuse2[] ={0.50754, 0.50754, 0.50754};GLfloat mat_shininess2[] ={128.0 * 0.6};GLfloat mat_specular3[] ={0.296648, 0.296648, 0.296648};GLfloat mat_ambient3[] ={0.25, 0.20725, 0.20725};GLfloat mat_diffuse3[] ={1, 0.829, 0.829};GLfloat mat_shininess3[] ={128.0 * 0.088};GLfloat mat_specular4[] ={0.633, 0.727811, 0.633};GLfloat mat_ambient4[] ={0.0215, 0.1745, 0.0215};GLfloat mat_diffuse4[] ={0.07568, 0.61424, 0.07568};GLfloat mat_shininess4[] ={128 * 0.6};GLfloat mat_specular5[] ={0.60, 0.60, 0.50};GLfloat mat_ambient5[] ={0.0, 0.0, 0.0};GLfloat mat_diffuse5[] ={0.5, 0.5, 0.0};GLfloat mat_shininess5[] ={128.0 * 0.25};#endif/* end of material definitions *//* start of the body motion functions */voidHeel1Add(void){ heel1 = (heel1 + HEEL_RATE) % 360;}voidHeel1Subtract(void){ heel1 = (heel1 - HEEL_RATE) % 360;}voidHeel2Add(void){ heel2 = (heel2 + HEEL_RATE) % 360;}voidHeel2Subtract(void){ heel2 = (heel2 - HEEL_RATE) % 360;}voidAnkle1Add(void){ ankle1 = (ankle1 + ANKLE_RATE) % 360;}voidAnkle1Subtract(void){ ankle1 = (ankle1 - ANKLE_RATE) % 360;}voidAnkle2Add(void){ ankle2 = (ankle2 + ANKLE_RATE) % 360;}voidAnkle2Subtract(void){ ankle2 = (ankle2 - ANKLE_RATE) % 360;}voidRotateAdd(void){ pivot = (pivot + ROTATE_RATE) % 360;}voidRotateSubtract(void){ pivot = (pivot - ROTATE_RATE) % 360;}voidMechTiltSubtract(void){ tilt = (tilt - TILT_RATE) % 360;}voidMechTiltAdd(void){ tilt = (tilt + TILT_RATE) % 360;}voidelbow1Add(void){ elbow1 = (elbow1 + ELBOW_RATE) % 360;}voidelbow1Subtract(void){ elbow1 = (elbow1 - ELBOW_RATE) % 360;}voidelbow2Add(void){ elbow2 = (elbow2 + ELBOW_RATE) % 360;}voidelbow2Subtract(void){ elbow2 = (elbow2 - ELBOW_RATE) % 360;}voidshoulder1Add(void){ shoulder1 = (shoulder1 + SHOULDER_RATE) % 360;}voidshoulder1Subtract(void){ shoulder1 = (shoulder1 - SHOULDER_RATE) % 360;}voidshoulder2Add(void){ shoulder2 = (shoulder2 + SHOULDER_RATE) % 360;}voidshoulder2Subtract(void){ shoulder2 = (shoulder2 - SHOULDER_RATE) % 360;}voidshoulder3Add(void){ shoulder3 = (shoulder3 + SHOULDER_RATE) % 360;}voidshoulder3Subtract(void){ shoulder3 = (shoulder3 - SHOULDER_RATE) % 360;}voidshoulder4Add(void){ shoulder4 = (shoulder4 + SHOULDER_RATE) % 360;}voidshoulder4Subtract(void){ shoulder4 = (shoulder4 - SHOULDER_RATE) % 360;}voidlat1Raise(void){ lat1 = (lat1 + LAT_RATE) % 360;}voidlat1Lower(void){ lat1 = (lat1 - LAT_RATE) % 360;}voidlat2Raise(void){ lat2 = (lat2 + LAT_RATE) % 360;}voidlat2Lower(void){ lat2 = (lat2 - LAT_RATE) % 360;}voidFireCannon(void){ fire = (fire + CANNON_RATE) % 360;}voidRaiseLeg1Forward(void){ hip11 = (hip11 + UPPER_LEG_RATE) % 360;}voidLowerLeg1Backwards(void){ hip11 = (hip11 - UPPER_LEG_RATE) % 360;}voidRaiseLeg1Outwards(void){ hip12 = (hip12 + UPPER_LEG_RATE_GROIN) % 360;}voidLowerLeg1Inwards(void){ hip12 = (hip12 - UPPER_LEG_RATE_GROIN) % 360;}voidRaiseLeg2Forward(void){ hip21 = (hip21 + UPPER_LEG_RATE) % 360;}voidLowerLeg2Backwards(void){ hip21 = (hip21 - UPPER_LEG_RATE) % 360;}voidRaiseLeg2Outwards(void){ hip22 = (hip22 + UPPER_LEG_RATE_GROIN) % 360;}voidLowerLeg2Inwards(void){ hip22 = (hip22 - UPPER_LEG_RATE_GROIN) % 360;}/* end of body motion functions *//* start of light source position functions */voidTurnRight(void){ turn = (turn - VIEW_TURN_RATE) % 360;}voidTurnLeft(void){ turn = (turn + VIEW_TURN_RATE) % 360;}voidTurnForwards(void){ turn1 = (turn1 - VIEW_TURN_RATE) % 360;}voidTurnBackwards(void){ turn1 = (turn1 + VIEW_TURN_RATE) % 360;}voidLightTurnRight(void){ lightturn = (lightturn + LIGHT_TURN_RATE) % 360;}voidLightTurnLeft(void){ lightturn = (lightturn - LIGHT_TURN_RATE) % 360;}voidLightForwards(void){ lightturn1 = (lightturn1 + LIGHT_TURN_RATE) % 360;}voidLightBackwards(void){ lightturn1 = (lightturn1 - LIGHT_TURN_RATE) % 360;}/* end of light source position functions *//* start of geometric shape functions */voidBox(float width, float height, float depth, char solid){ char i, j = 0; float x = width / 2.0, y = height / 2.0, z = depth / 2.0; for (i = 0; i < 4; i++) { glRotatef(90.0, 0.0, 0.0, 1.0); if (j) { if (!solid) glBegin(GL_LINE_LOOP); else glBegin(GL_QUADS); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-x, y, z); glVertex3f(-x, -y, z); glVertex3f(-x, -y, -z); glVertex3f(-x, y, -z); glEnd(); if (solid) { glBegin(GL_TRIANGLES); glNormal3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, z); glVertex3f(-x, y, z); glVertex3f(-x, -y, z); glNormal3f(0.0, 0.0, -1.0); glVertex3f(0.0, 0.0, -z); glVertex3f(-x, -y, -z); glVertex3f(-x, y, -z); glEnd(); } j = 0; } else { if (!solid) glBegin(GL_LINE_LOOP); else glBegin(GL_QUADS); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-y, x, z); glVertex3f(-y, -x, z); glVertex3f(-y, -x, -z); glVertex3f(-y, x, -z); glEnd(); if (solid) { glBegin(GL_TRIANGLES); glNormal3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, z); glVertex3f(-y, x, z); glVertex3f(-y, -x, z); glNormal3f(0.0, 0.0, -1.0); glVertex3f(0.0, 0.0, -z); glVertex3f(-y, -x, -z); glVertex3f(-y, x, -z); glEnd(); } j = 1; } }}voidOctagon(float side, float height, char solid){ char j; float x = sin(0.785398163) * side, y = side / 2.0, z = height / 2.0, c; c = x + y; for (j = 0; j < 8; j++) { glTranslatef(-c, 0.0, 0.0); if (!solid) glBegin(GL_LINE_LOOP); else glBegin(GL_QUADS); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(0.0, -y, z); glVertex3f(0.0, y, z); glVertex3f(0.0, y, -z); glVertex3f(0.0, -y, -z); glEnd(); glTranslatef(c, 0.0, 0.0); if (solid) { glBegin(GL_TRIANGLES); glNormal3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, z); glVertex3f(-c, -y, z); glVertex3f(-c, y, z); glNormal3f(0.0, 0.0, -1.0); glVertex3f(0.0, 0.0, -z); glVertex3f(-c, y, -z); glVertex3f(-c, -y, -z); glEnd(); } glRotatef(45.0, 0.0, 0.0, 1.0); }}/* end of geometric shape functions */#ifdef NORMvoidNormalize(float v[3]){ GLfloat d = sqrt(v[1] * v[1] + v[2] * v[2] + v[3] * v[3]); if (d == 0.0) { printf("zero length vector"); return; } v[1] /= d; v[2] /= d; v[3] /= d;}voidNormXprod(float v1[3], float v2[3], float v[3], float out[3]){ GLint i, j; GLfloat length; out[0] = v1[1] * v2[2] - v1[2] * v2[1]; out[1] = v1[2] * v2[0] - v1[0] * v2[2]; out[2] = v1[0] * v2[1] - v1[1] * v2[0]; Normalize(out);}#endifvoidSetMaterial(GLfloat spec[], GLfloat amb[], GLfloat diff[], GLfloat shin[]){ glMaterialfv(GL_FRONT, GL_SPECULAR, spec); glMaterialfv(GL_FRONT, GL_SHININESS, shin); glMaterialfv(GL_FRONT, GL_AMBIENT, amb); glMaterialfv(GL_FRONT, GL_DIFFUSE, diff);}voidMechTorso(char solid){ glNewList(SOLID_MECH_TORSO, GL_COMPILE);#ifdef LIGHT SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);#endif glColor3f(1.0, 1.0, 0.0); Box(1.0, 1.0, 3.0, solid); glTranslatef(0.75, 0.0, 0.0);#ifdef LIGHT SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -