Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

OGL rysowanie siatki...

Ostatnio zmodyfikowano 2011-03-20 21:33
Autor Wiadomość
albatross201
Temat założony przez niniejszego użytkownika
OGL rysowanie siatki...
» 2011-03-19 15:21:07
Witam.
Mam swój projekt OGL w ktorym nie moge narysować siatki i nie wiem właściwie czemu. Może mógłby mi ktoś pomóc
Oto mój przykładowy kod:


C/C++
#include <stdlib.h>
#include <GL/glut.h>


// stałe do obsługi menu podręcznego

enum
{
    FULL_WINDOW, // aspekt obrazu - całe okno
    ASPECT_1_1, // aspekt obrazu 1:1
    WIRE_SPHERE, // kula
    WIRE_CONE, // stożek
    WIRE_CUBE, // sześcian
    WIRE_TORUS, // torus
    WIRE_DODECAHEDRON, // dwunastościan
    WIRE_TEAPOT, // czajnik
    WIRE_OCTAHEDRON, // ośmiościan
    WIRE_TETRAHEDRON, // czworościan
    WIRE_ICOSAHEDRON, // dwudziestościan
    EXIT // wyjście
};

// aspekt obrazu

int aspect = FULL_WINDOW;

// rodzaj obiektu

int object = WIRE_SPHERE;

// rozmiary bryły obcinania

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;

// współczynnik skalowania

GLfloat scale = 1.0;

// kąty obrotu

GLfloat rotatex = 0.0;
GLfloat rotatey = 0.0;

// przesunięcie

GLfloat translatex = 0.0;
GLfloat translatey = 0.0;

// wskaźnik naciśnięcia lewego przycisku myszki

int button_state = GLUT_UP;

// położenie kursora myszki

int button_x, button_y;

void siatka()
{
    GLfloat x, y, z, angle;
    GLint i, j;
   
   
    glBegin( GL_LINES );
   
    z = 0.0f;
    y = 0.0f;
   
    glColor3f( 0.2f, 0.8f, 0.0f );
    for( i =- 100; i < 100; i = i + 2 )
    {
        glVertex3f( - 100.0f, y, i );
        glVertex3f( 100.0f, y, i );
    }
    for( j =- 100; j < 100; j = j + 2 )
    {
        glVertex3f( j, y, - 100.0f );
        glVertex3f( j, y, 100.0f );
    }
   
    glEnd();
   
   
   
}
void Display()
{
    // kolor tła - zawartość bufora koloru
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
   
    // czyszczenie bufora koloru
    glClear( GL_COLOR_BUFFER_BIT );
   
    // wybór macierzy modelowania
    glMatrixMode( GL_MODELVIEW );
   
    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();
   
    // przesunięcie układu współrzędnych obiektu do środka bryły odcinania
    glTranslatef( 0, 0, -( near + far ) / 2 );
   
    // skalowanie obiektu - klawisze "+" i "-"
    glScalef( scale, scale, scale );
   
    // obroty obiektu - klawisze kursora
    glRotatef( rotatex, 1.0, 0, 0 );
    glRotatef( rotatey, 0, 1.0, 0 );
   
   
    GLfloat sa[ 3 ] = { 0.0f, 0.0f, 0.0f };
    GLfloat sb[ 3 ] = { 1.0f, 0.0f, 0.0f };
    GLfloat sc[ 3 ] = { 1.0f, 4.0f, 0.0f };
    GLfloat sd[ 3 ] = { 0.0f, 4.0f, 0.0f };
    GLfloat se[ 3 ] = { 0.0f, 0.0f, - 1.0f };
    GLfloat sf[ 3 ] = { 1.0f, 0.0f, - 1.0f };
    GLfloat sg[ 3 ] = { 1.0f, 4.0f, - 1.0f };
    GLfloat sh[ 3 ] = { 0.0f, 4.0f, - 1.0f };
   
    // Sciany skladowe
    glColor3f( 1.0f, 0.0f, 0.0f );
    glBegin( GL_POLYGON );
    glVertex3fv( sa );
    glVertex3fv( sb );
    glVertex3fv( sc );
    glVertex3fv( sd );
    glEnd();
   
    glColor3f( 0.0f, 1.0f, 0.0f );
    glBegin( GL_POLYGON );
    glVertex3fv( sb );
    glVertex3fv( sf );
    glVertex3fv( sg );
    glVertex3fv( sc );
    glEnd();
   
    glColor3f( 0.0f, 0.0f, 1.0f );
    glBegin( GL_POLYGON );
    glVertex3fv( sf );
    glVertex3fv( se );
    glVertex3fv( sh );
    glVertex3fv( sg );
    glEnd();
   
    glColor3f( 1.0f, 1.0f, 0.0f );
    glBegin( GL_POLYGON );
    glVertex3fv( se );
    glVertex3fv( sa );
    glVertex3fv( sd );
    glVertex3fv( sh );
    glEnd();
   
    glColor3f( 0.0f, 1.0f, 1.0f );
    glBegin( GL_POLYGON );
    glVertex3fv( sd );
    glVertex3fv( sc );
    glVertex3fv( sg );
    glVertex3fv( sh );
    glEnd();
   
    glColor3f( 1.0f, 0.0f, 1.0f );
    glBegin( GL_POLYGON );
    glVertex3fv( sa );
    glVertex3fv( sb );
    glVertex3fv( sf );
    glVertex3fv( se );
    glEnd();
   
    // skierowanie poleceń do wykonania
    glFlush();
   
    // zamiana buforów koloru
    glutSwapBuffers();
}

// zmiana wielkości okna

void Reshape( int width, int height )
{
    // obszar renderingu - całe okno
    glViewport( 0, 0, width, height );
   
    // wybór macierzy rzutowania
    glMatrixMode( GL_PROJECTION );
   
    // macierz rzutowania = macierz jednostkowa
    glLoadIdentity();
   
    // parametry bryły obcinania
    if( aspect == ASPECT_1_1 )
    {
        // wysokość okna większa od wysokości okna
        if( width < height && width > 0 )
             glFrustum( left, right, bottom * height / width, top * height / width, near, far );
        else
       
        // szerokość okna większa lub równa wysokości okna
        if( width >= height && height > 0 )
             glFrustum( left * width / height, right * width / height, bottom, top, near, far );
       
    }
    else
         glFrustum( left, right, bottom, top, near, far );
   
    // generowanie sceny 3D
    Display();
}

// obsługa klawiatury

void Keyboard( unsigned char key, int x, int y )
{
    // klawisz +
    if( key == '+' )
         scale += 0.1;
    else
   
    // klawisz -
    if( key == '-' && scale > 0.1 )
         scale -= 0.1;
   
    // odrysowanie okna
    Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
}

// obsługa klawiszy funkcyjnych i klawiszy kursora

void SpecialKeys( int key, int x, int y )
{
    switch( key )
    {
        // kursor w lewo
    case GLUT_KEY_LEFT:
        rotatey -= 5;
        break;
       
        // kursor w górę
    case GLUT_KEY_UP:
        rotatex -= 5;
        break;
       
        // kursor w prawo
    case GLUT_KEY_RIGHT:
        rotatey += 5;
        break;
       
        // kursor w dół
    case GLUT_KEY_DOWN:
        rotatex += 5;
        break;
    }
   
    // odrysowanie okna
    Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
}

// obsługa przycisków myszki

void MouseButton( int button, int state, int x, int y )
{
    if( button == GLUT_LEFT_BUTTON )
    {
        // zapamiętanie stanu lewego przycisku myszki
        button_state = state;
       
        // zapamiętanie położenia kursora myszki
        if( state == GLUT_DOWN )
        {
            button_x = x;
            button_y = y;
        }
    }
}

// obsługa menu podręcznego

void Menu( int value )
{
    switch( value )
    {
        // obszar renderingu - całe okno
    case FULL_WINDOW:
        aspect = FULL_WINDOW;
        Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
        break;
       
        // obszar renderingu - aspekt 1:1
    case ASPECT_1_1:
        aspect = ASPECT_1_1;
        Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
        break;
       
        // wyjście
    case EXIT:
        exit( 0 );
    }
}

int main( int argc, char * argv[] )
{
    // inicjalizacja biblioteki GLUT
    glutInit( & argc, argv );
   
    // inicjalizacja bufora ramki
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
   
    // rozmiary głównego okna programu
    glutInitWindowSize( 600, 600 );
   
    // utworzenie głównego okna programu
    #ifdef WIN32
   
    glutCreateWindow( "Przekształcenia" );
    #else
   
    glutCreateWindow( "Przeksztalcenia" );
    #endif
   
    // dołączenie funkcji generującej scenę 3D
    glutDisplayFunc( Display );
    glutDisplayFunc( siatka );
   
    // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
    glutReshapeFunc( Reshape );
   
    // dołączenie funkcji obsługi klawiatury
    glutKeyboardFunc( Keyboard );
   
    // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
    glutSpecialFunc( SpecialKeys );
   
    // obsługa przycisków myszki
    glutMouseFunc( MouseButton );
   
    // utworzenie podmenu - aspekt obrazu
    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 );
   
   
    // menu główne
    glutCreateMenu( Menu );
    glutAddSubMenu( "Aspekt obrazu", MenuAspect );
    #ifdef WIN32
   
    glutAddMenuEntry( "Wyjście", EXIT );
    #else
   
    glutAddMenuEntry( "Wyjscie", EXIT );
    #endif
   
    // określenie przycisku myszki obsługującego menu podręczne
    glutAttachMenu( GLUT_RIGHT_BUTTON );
   
    // wprowadzenie programu do obsługi pętli komunikatów
    glutMainLoop();
    return 0;
}
Po prostu dodałem funkcje siatka i wywołuje ją w mainie.
Czekam na odpowiedźi z góry dzięki:)
P-29347
DejaVu
» 2011-03-19 18:06:25
Proponuję zacząć od najprostszego kodu renderującego coś w OpenGL'u i testować kilka linijek na krzyż. Może masz kamerę źle ustawioną i rysujesz poza obszarem widzialnym, może nie masz jakiejś flagi ustawionej OpenGL'a, która jest odpowiedzialna za rysowanie krawędzi siatki... powodów może być wiele zważywszy na fakt, że mówimy o OpenGL'u, który jest bardzo elastyczny i każdy konfiguruje sobie scenę po swojemu już na samym początku.
P-29367
dmx81
» 2011-03-19 18:40:08
a sprobuj wrzucic funkcje siatka do funkcji display(), jeszcze przed flush() i przed swap()
i przed funkcja siatka moze tez wywolaj
glLoadIdentity()
 bo jak uzywales translacji i obrotow to moze sie zle wyswietlic
P-29380
albatross201
Temat założony przez niniejszego użytkownika
» 2011-03-20 21:33:36
Dobra, siatka się pokazała ale nie można nią ruszać, powinienem sobie z tym poradzić więc za pomoc bardzo dziękuje:)
P-29492
« 1 »
  Strona 1 z 1