/ Published in: C++
Little test to control separate objects in OpenGL using pushMatrix() and popMatrix()
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
#include <GLUT/glut.h> #include <iostream> using namespace std; //initialising variables float x_positie = 0.0, x_doel = 0.0, x_doel2, x_kracht = 0.02, x_versnelling = -0.001, weerstand = 0.99, doeldist = 0.0; float y_positie = 0.0, y_doel = 0.0, y_doel2, y_kracht = 0.02, y_versnelling = -0.001, rot = 0.0; float z_positie = 0.0, z_doel = 0.0, z_doel2, z_kracht = 0.02, z_versnelling = -0.001, t = 0.0; //initialising states void init() { glClearColor(0.0,0.0,0.0,1.0); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); } //reshaping the viewport and projection void reshape(int width, int height) { glViewport(0, 0, 1024, 768); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.,(GLfloat) width/(GLfloat) height,0.1, 800.0); glMatrixMode(GL_MODELVIEW); gluLookAt(0.0,0.0,200.0, 0.0, 0.0, 0.0, 0,1,0); } //reading the keyboard input void key(unsigned char key, int x, int y){ switch (key){ case 32: x_doel2 = (rand()%160-80); y_doel2 = (rand()%160-80); z_doel2 = (rand()%160-80); doeldist = sqrt (pow((x_doel-x_doel2),2.0) + pow((y_doel-y_doel2),2.0) + pow((z_doel-z_doel2),2.0)); break; } } //drawing and displaying void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glRotatef(0.5,0,1,0); glPushMatrix(); x_positie += x_kracht ; y_positie += y_kracht ; z_positie += z_kracht ; x_versnelling = (x_doel2 - x_positie)*0.0003; y_versnelling = (y_doel2 - y_positie)*0.0003; z_versnelling = (z_doel2 - z_positie)*0.0003; x_kracht += x_versnelling; y_kracht += y_versnelling; z_kracht += z_versnelling; x_kracht *= weerstand; y_kracht *= weerstand; z_kracht *= weerstand; glBegin(GL_LINES); glVertex3f(x_doel,y_doel,z_doel); glVertex3f(x_positie,y_positie,z_positie); glEnd(); glTranslatef(x_positie, y_positie, z_positie); glColor4f(0.6, 0.0, 0.0, 1.0); glutSolidSphere(2.0,9,9); glPopMatrix(); glPushMatrix(); glTranslatef(x_positie+sin(t)*9,y_positie+cos(t)*9,z_positie); glutSolidSphere(2.0,9,9); if (t > 6.2829){ t = 0; } t += 0.02; glPopMatrix(); glPushMatrix(); glTranslatef(x_doel, y_doel, z_doel); glColor4f(0.3,0.3,0.3,0.3); glutSolidSphere(5.0,15,15); glPopMatrix(); glutSwapBuffers(); } //main loop with initialising of window and glut, assigning functions int main(int argc, char** argv) { srand(time(NULL)); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutGameModeString("1024x768:32"); glutEnterGameMode(); init(); glutDisplayFunc(display); glutIdleFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(key); glutMainLoop(); return 0; }