dudiczek Temat założony przez niniejszego użytkownika |
» 2012-01-10 17:54:02 Zmodyfikowałem lekko kod i wczytują się mi wszystkie obiekty :). Został jeszcze jeden problem jak je oddzielnie poustawiać. Gdy stosuję przesunięcia to przesuwa mi wszystkie naraz. A chciałbym odzielnie...macie jakieś rady?
#include <GL/glut.h> #include <GL/glu.h> #include <stdlib.h> #include <stdio.h> #include "obj.h" #include <iostream>
enum { FULL_WINDOW, ASPECT_1_1, EXIT };
int aspect = FULL_WINDOW;
const GLdouble left = - 10.0; const GLdouble right = 10.0; const GLdouble bottom = - 10.0; const GLdouble top = 10.0; const GLdouble neara = 10.0; const GLdouble fara = 30.0;
GLfloat rotatex = 0.0; GLfloat rotatey = 0.0;
int button_state = GLUT_UP;
int button_x, button_y;
GLfloat scale = 1.0;
GLfloat translatex = 0.0; GLfloat translatey = 0.0;
GLuint OBJECT_LIST[ 5 ];
void Display() { glClearColor( 3.0, 3.0, 1.0, 1.0 ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glEnable( GL_DEPTH_TEST ); glTranslatef( 0, 0, -( neara + fara ) / 2 ); glTranslatef( translatex, translatey, 0.0 ); glRotatef( rotatex, 1.0, 0.0, 0.0 ); glRotatef( rotatey, 0.0, 1.0, 0.0 ); glScalef( scale, scale, scale ); glLightModelf( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); glEnable( GL_NORMALIZE ); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); for( int i = 0; i <= 5; i++ ) { glCallList( OBJECT_LIST[ i ] ); } glFlush(); glutSwapBuffers(); }
void Reshape( int width, int height ) { glViewport( 0, 0, width, height ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); if( aspect == ASPECT_1_1 ) { if( width < height && width > 0 ) glFrustum( left, right, bottom * height / width, top * height / width, neara, fara ); else if( width >= height && height > 0 ) glFrustum( left * width / height, right * width / height, bottom, top, neara, fara ); } else glFrustum( left, right, bottom, top, neara, fara ); Display(); }
void SpecialKeys( int key, int x, int y ) { switch( key ) { case GLUT_KEY_UP: translatey += 0.5; break; case GLUT_KEY_DOWN: translatey -= 0.5; break; case GLUT_KEY_LEFT: translatex -= 0.5; break; case GLUT_KEY_RIGHT: translatex += 0.5; break; case GLUT_KEY_PAGE_UP: scale += 0.5; break; case GLUT_KEY_PAGE_DOWN: if( scale > 0.5 ) scale -= 0.5; break; } glutPostRedisplay(); }
void Keyboard( unsigned char key, int x, int y ) { if( key == '+' ) scale += 0.01; else if( key == '-' && scale > 0.01 ) scale -= 0.01; Display(); }
void MouseButton( int button, int state, int x, int y ) { if( button == GLUT_LEFT_BUTTON ) { button_state = state; if( state == GLUT_DOWN ) { button_x = x; button_y = y; } } }
void MouseMotion( int x, int y ) { if( button_state == GLUT_DOWN ) { rotatey += 30 *( right - left ) / glutGet( GLUT_WINDOW_WIDTH ) *( x - button_x ); button_x = x; rotatex -= 30 *( top - bottom ) / glutGet( GLUT_WINDOW_HEIGHT ) *( button_y - y ); button_y = y; glutPostRedisplay(); } }
void Menu( int value ) { switch( value ) { case FULL_WINDOW: aspect = FULL_WINDOW; Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) ); break; case ASPECT_1_1: aspect = ASPECT_1_1; Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) ); break; case EXIT: exit( 0 ); } }
int main( int argc, char * argv[] ) { glutInit( & argc, argv ); glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ); glutInitWindowSize( 500, 500 ); glutCreateWindow( "Symulator pracy farmera" ); glutDisplayFunc( Display ); glutReshapeFunc( Reshape ); glutKeyboardFunc( Keyboard ); glutSpecialFunc( SpecialKeys ); glutMouseFunc( MouseButton ); glutMotionFunc( MouseMotion ); glutCreateMenu( Menu ); int MenuAspect = glutCreateMenu( Menu ); #ifdef WIN32 glutAddMenuEntry( "Aspekt obrazu - całe okno", FULL_WINDOW ); #else glutAddMenuEntry( "Aspekt obrazu - cale okno", FULL_WINDOW ); #endif glutAddMenuEntry( "Aspekt obrazu 1:1", ASPECT_1_1 ); glutCreateMenu( Menu ); #ifdef WIN32 glutAddSubMenu( "Aspekt obrazu", MenuAspect ); glutAddMenuEntry( "Wyjście", EXIT ); #else glutAddSubMenu( "Aspekt obrazu", MenuAspect ); glutAddMenuEntry( "Wyjscie", EXIT ); #endif glutAttachMenu( GLUT_RIGHT_BUTTON ); glutIdleFunc( Display ); for( int i = 0; i <= 5; i++ ) { if( !load_obj( argv[ i ], OBJECT_LIST[ i ] ) ) { printf( "Niepoprawny odczyt pliku %s", argv[ i ] ); } } glutMainLoop(); return 0; }
[ / code ][ / i ]
|
|
SeaMonster131 |
» 2012-01-10 19:50:23 Ustawiasz parametry jednego obiektu, dajesz glLoadIdentity(); dla zresetowania widoku, następnie ustawiasz parametry następnego obiektu.. itd |
|
dudiczek Temat założony przez niniejszego użytkownika |
» 2012-01-10 20:10:37 dziękuje za odpowiedź, spróbowałem to zrobić ale do końca nie rozumie tak to ma być zrobione Czy mniej więcej tak jak kombinuje w tej instrukcji warunkowej. if( OBJECT_LIST[ i ] == OBJECT_LIST[ 1 ] ) { translatex += 1.0; glLoadIdentity(); } }
|
|
dudiczek Temat założony przez niniejszego użytkownika |
» 2012-01-14 18:22:30 Myślałem nad tym. I w zasadzie listę wyświetlania listy z obiektem mam w tym kodzie for( int i = 0; i <= 5; i++ ) { glCallList( OBJECT_LIST[ i ] ); glLoadIdentity(); }
Jeżeli tutaj po glCallList dam glLoadIdentity to w ogóle mi się obiekty nie wyświetlają. Ponieważ po niżej mam taki kod: if( load_obj( argv[ 1 ], OBJECT_LIST[ 1 ] ) ) { translatex += 2.0; }
Tutaj jest odwołanie się do OBJECT listy która wcześniej jest kasowana przez glLoadIdentity. Problem jest taki, że po załadowaniu listy jest odrazu ona zerowana i funkcja ładująca obiekty nie może wczytać obiektu. Jak więc zrobić, żeby po załadowaniu pierwszego elementu object listy wczytać obiekt, po czym wyzerować listę, załadować drugi element i wczytać obiekt? |
|
1 « 2 » |