artek105 Temat założony przez niniejszego użytkownika |
[openGL][Dev-cpp 4.9.9.2]Problem z mapa do gry 3D » 2014-01-28 23:13:17 Otóż mam taki niby banalny problem a siedzę już nad nim od dobrych 2 tygodni a na googlach same śmieci. Chciałbym stworzyć mapę(podstawę do gry) na osi x=0. Kiedy kompiluję mapa się tworzy tak jak chciałem, lecz kiedy chcę ją obrócić tak, żeby obserwator widział ją pod kątem (np. 30 stopni) to mapa nie pokazuje się cała lecz jej część. Jest tam pewna granica, której nie mogę ominąć. Widzę tylko jakby jej skrawek. Nie umiem tego jaśniej objaśnić. Powiem od razu, że bazowałem na aplikacji z tej strony. Tutaj jest kod: #include <GL/glut.h> #include <stdlib.h>
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 near = 50.0; const GLdouble far = 70.0;
GLfloat scale = 1.0;
GLfloat rotatex = 0.0; GLfloat rotatey = 0.0;
GLfloat translatex = 0.0; GLfloat translatey = 0.0;
int button_state = GLUT_UP;
int button_x, button_y;
void Display() { glClearColor( 1.0, 1.0, 1.0, 1.0 ); glClear( GL_COLOR_BUFFER_BIT ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glTranslatef( 0, 0, -( near + far ) / 2 ); glTranslatef( translatex, translatey, 0.0 ); glScalef( scale, scale, scale ); glRotatef( rotatex, 1.0, 0, 0 ); glRotatef( rotatey, 0, 1.0, 0 ); glColor3f( 0.0, 0.0, 0.0 ); glColor3f( 0.0, 1.0, 0.0 ); glBegin( GL_LINES ); short int i; for( i =- 100; i <= 100; i++ ) { glVertex3f( 100, - i, i ); glVertex3f( - 100, - i, i ); glVertex3f( i, - 100, 100 ); glVertex3f( i, 100, - 100 ); } glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( - 100, 0, 0 ); glVertex3f( 100, 0, 0 ); glVertex3f( 0, - 100, 100 ); glVertex3f( 0, 100, - 100 ); glColor3f( 0.0, 0.0, 0.0 ); glEnd(); 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, near, far ); else if( width >= height && height > 0 ) glFrustum( left * width / height, right * width / height, bottom, top, near, far ); } else glFrustum( left, right, bottom, top, near, far ); Display(); }
void Keyboard( unsigned char key, int x, int y ) { if( key == '+' ) scale += 0.1; else if( key == '-' && scale > 0.1 ) scale -= 0.1; Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) ); }
void SpecialKeys( int key, int x, int y ) { switch( key ) { case GLUT_KEY_LEFT: rotatey -= 1; break; case GLUT_KEY_UP: rotatex -= 1; break; case GLUT_KEY_RIGHT: rotatey += 1; break; case GLUT_KEY_DOWN: rotatex += 1; break; } Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) ); }
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 ) { translatex += 1.1 *( right - left ) / glutGet( GLUT_WINDOW_WIDTH ) *( x - button_x ); button_x = x; translatey += 1.1 *( 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 ); glutInitWindowSize( 400, 400 ); #ifdef WIN32 glutCreateWindow( "Przekształcenia" ); #else glutCreateWindow( "Przeksztalcenia" ); #endif glutDisplayFunc( Display ); glutReshapeFunc( Reshape ); glutKeyboardFunc( Keyboard ); glutSpecialFunc( SpecialKeys ); glutMouseFunc( MouseButton ); glutMotionFunc( MouseMotion ); 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 ); glutAddSubMenu( "Aspekt obrazu", MenuAspect ); #ifdef WIN32 glutAddMenuEntry( "Wyjście", EXIT ); #else glutAddMenuEntry( "Wyjscie", EXIT ); #endif glutAttachMenu( GLUT_RIGHT_BUTTON ); glutMainLoop(); return 0; }
Bez tego nie mogę iść dalej, a sam sobie nie dam rady, bo jestem początkujący w openGL. Jeśli ktoś to umie to bardzo proszę o pomoc. Gdybym czegoś nie napisał to proszę zwrócić uwagę i dopiszę. Z góry dzięki |