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

[OpenGL] Kolorowanie kostki Rubika w GLUT

Ostatnio zmodyfikowano 2015-11-21 16:03
Autor Wiadomość
veelenar
Temat założony przez niniejszego użytkownika
[OpenGL] Kolorowanie kostki Rubika w GLUT
» 2015-11-21 10:13:07
Hej, dopiero zaczynam swoją przygodę z OpenGL i pisząc kostkę Rubika chciałem w pewnym momencie przerzucić się na bibliotekę GLUT. Przepisałem program, lecz nie koloruje kostki(wyświetla czarną). Próbuję rozwiązań z tego kursu: http://cpp0x.pl/kursy​/Kurs-OpenGL-C++​/Kolory-i-cieniowanie/109, jednak to nie pomaga... Jakieś sugestie? Poniżej zamieszczam kod źródłowy:

 
C/C++
#include <math.h>
#include <stdlib.h>
#include <Windows.h>
#include <gl\GL.h>
#include <gl\GLU.h>
#include <glut.h>
#include "Kostka.h"

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

enum
{
    FULL_WINDOW, // aspekt obrazu - całe okno
    ASPECT_1_1, // aspekt obrazu 1:1
    EXIT // wyjście
};

// aspekt obrazu

int aspect = FULL_WINDOW;

// 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 neaar = 50.0;
const GLdouble faar = 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;


extern void UstawKolor( int numerKoloru );

void RysujSzescian( float x, float y, float z, int colorx, int colory, int colorz )
{
    //bool koloruj = true;
    float da = 0.6f / 2;
    float da_2 = da - 0.01f;
   
   
   
    //UstawKolor(0);
    //glLineWidth(3.5f);
    //glBegin(GL_LINE_LOOP);
    ////tylna
    //glVertex3f(x + da, y - da, z - da);
    //glVertex3f(x + da, y + da, z - da);
    //glVertex3f(x - da, y + da, z - da);
    //glVertex3f(x - da, y - da, z - da);
    //glEnd();
   
   
   
    //glBegin(GL_LINE_LOOP);
    ////przednia
    //glVertex3f(x + da, y - da, z + da);
    //glVertex3f(x + da, y + da, z + da);
    //glVertex3f(x - da, y + da, z + da);
    //glVertex3f(x - da, y - da, z + da);
    //glEnd();
   
    UstawKolor( colorz );
   
    glBegin( GL_POLYGON );
    //tylna
    glVertex3f( x + da_2, y - da_2, z - da_2 );
    glVertex3f( x + da_2, y + da_2, z - da_2 );
    glVertex3f( x - da_2, y + da_2, z - da_2 );
    glVertex3f( x - da_2, y - da_2, z - da_2 );
    glEnd();
   
   
   
    glBegin( GL_POLYGON );
    //przednia
    glVertex3f( x + da_2, y - da_2, z + da_2 );
    glVertex3f( x + da_2, y + da_2, z + da_2 );
    glVertex3f( x - da_2, y + da_2, z + da_2 );
    glVertex3f( x - da_2, y - da_2, z + da_2 );
    glEnd();
   
   
    //UstawKolor(0);
   
    //glBegin(GL_LINE_LOOP);
    ////prawa
    //glVertex3f(x + da, y + da, z - da);
    //glVertex3f(x + da, y + da, z + da);
    //glVertex3f(x + da, y - da, z + da);
    //glVertex3f(x + da, y - da, z - da);
    //glEnd();
   
   
   
    //glBegin(GL_LINE_LOOP);
    ////lewa
    //glVertex3f(x - da, y + da, z - da);
    //glVertex3f(x - da, y + da, z + da);
    //glVertex3f(x - da, y - da, z + da);
    //glVertex3f(x - da, y - da, z - da);
    //glEnd();
   
    UstawKolor( colorx );
   
    glBegin( GL_POLYGON );
    //prawa
    glVertex3f( x + da_2, y + da_2, z - da_2 );
    glVertex3f( x + da_2, y + da_2, z + da_2 );
    glVertex3f( x + da_2, y - da_2, z + da_2 );
    glVertex3f( x + da_2, y - da_2, z - da_2 );
    glEnd();
   
   
   
    glBegin( GL_POLYGON );
    //lewa
    glVertex3f( x - da_2, y + da_2, z - da_2 );
    glVertex3f( x - da_2, y + da_2, z + da_2 );
    glVertex3f( x - da_2, y - da_2, z + da_2 );
    glVertex3f( x - da_2, y - da_2, z - da_2 );
    glEnd();
   
    //UstawKolor(0);
   
    //glBegin(GL_LINE_LOOP);
    ////góra
    //glVertex3f(x + da, y + da, z - da);
    //glVertex3f(x + da, y + da, z + da);
    //glVertex3f(x - da, y + da, z + da);
    //glVertex3f(x - da, y + da, z - da);
    //glEnd();
   
   
   
    //glBegin(GL_LINE_LOOP);
    ////dół
    //glVertex3f(x + da, y - da, z - da);
    //glVertex3f(x + da, y - da, z + da);
    //glVertex3f(x - da, y - da, z + da);
    //glVertex3f(x - da, y - da, z - da);
    //glEnd();
   
    UstawKolor( colory );
   
    glBegin( GL_POLYGON );
    //góra
    glVertex3f( x + da_2, y + da_2, z - da_2 );
    glVertex3f( x + da_2, y + da_2, z + da_2 );
    glVertex3f( x - da_2, y + da_2, z + da_2 );
    glVertex3f( x - da_2, y + da_2, z - da_2 );
    glEnd();
   
   
    glBegin( GL_POLYGON );
    //dół
    glVertex3f( x + da_2, y - da_2, z - da_2 );
    glVertex3f( x + da_2, y - da_2, z + da_2 );
    glVertex3f( x - da_2, y - da_2, z + da_2 );
    glVertex3f( x - da_2, y - da_2, z - da_2 );
    glEnd();
}

void UstawKolor( int numerKoloru )
{
    switch( numerKoloru )
    {
    case 0:
        glColor3ub( 0, 0, 0 );
        //czarny - puste pole
        break;
    case 1:
        glColor3ub( 7, 205, 22 );
        //zielony
        break;
    case 2:
        glColor3ub( 255, 255, 0 );
        //zolty
        break;
    case 3:
        glColor3ub( 255, 255, 255 );
        //bialy
        break;
    case 4:
        glColor3ub( 0, 0, 255 );
        //niebieski
        break;
    case 5:
        glColor3ub( 255, 0, 0 );
        //czerwony
        break;
    case 6:
        glColor3ub( 255, 127, 39 );
        //pomaranczowy
        break;
    }
}


void RysujKostke()
{
    for( int x = 0; x < 3; x++ ) {
        for( int y = 0; y < 3; y++ ) {
            for( int z = 0; z < 3; z++ ) {
                int * kolor = kostka[ x ][ y ][ z ].kolor;
                RysujSzescian( x * 0.6f - 0.6f,( y *- 0.6f ) + 0.6,( z *- 0.6f ) + 0.6f, kolor[ 0 ], kolor[ 1 ], kolor[ 2 ] );
            }
        }
    }
}

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, -( neaar + faar ) / 2 );
   
    // przesunięcie obiektu - ruch myszką
    glTranslatef( translatex, translatey, 0.0 );
   
    // skalowanie obiektu - klawisze "+" i "-"
    glScalef( scale, scale, scale );
   
    // obroty obiektu - klawisze kursora
    glRotatef( rotatex, 1.0, 0, 0 );
    glRotatef( rotatey, 0, 1.0, 0 );
   
    RysujKostke();
   
   
    // 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, neaar, faar );
        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, neaar, faar );
       
    }
    else
         glFrustum( left, right, bottom, top, neaar, faar );
   
    // 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 -= 1;
        break;
       
        // kursor w górę
    case GLUT_KEY_UP:
        rotatex -= 1;
        break;
       
        // kursor w prawo
    case GLUT_KEY_RIGHT:
        rotatey += 1;
        break;
       
        // kursor w dół
    case GLUT_KEY_DOWN:
        rotatex += 1;
        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 ruchu kursora myszki

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();
    }
}

// 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;
    }
}

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( 400, 400 );
   
    // utworzenie głównego okna programu
    #ifdef WIN32
   
    glutCreateWindow( "Przekształcenia" );
    #else
   
    glutCreateWindow( "Przeksztalcenia" );
    #endif
   
    // dołączenie funkcji generującej scenę 3D
    glutDisplayFunc( Display );
   
    // 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 );
   
    // obsługa ruchu kursora myszki
    glutMotionFunc( MouseMotion );
   
    // 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;
}


C/C++
#include "Kostka.h"

elementKostki kostka[ 3 ][ 3 ][ 3 ];

void GenerujKostke() {
   
    for( int x = 0; x < 3; x++ ) {
        for( int y = 0; y < 3; y++ ) {
            for( int z = 0; z < 3; z++ ) {
                kostka[ x ][ y ][ z ].iloscScian = dwie;
                kostka[ x ][ y ][ z ].kolor[ 0 ] = 0;
                kostka[ x ][ y ][ z ].kolor[ 1 ] = 0;
                kostka[ x ][ y ][ z ].kolor[ 2 ] = 0;
                kostka[ z ][ y ][ x ].numerElementu = x + y + z;
            }
        }
    }
   
    kostka[ 1 ][ 1 ][ 0 ].iloscScian = jedna;
    kostka[ 1 ][ 1 ][ 2 ].iloscScian = jedna;
    kostka[ 1 ][ 0 ][ 1 ].iloscScian = jedna;
    kostka[ 1 ][ 2 ][ 1 ].iloscScian = jedna;
    kostka[ 0 ][ 1 ][ 1 ].iloscScian = jedna;
    kostka[ 2 ][ 1 ][ 1 ].iloscScian = jedna;
   
    for( int i = 0; i < 3; i++ ) {
        for( int j = 0; j < 3; j++ ) {
            kostka[ 0 ][ i ][ j ].kolor[ 0 ] = 6;
            kostka[ 2 ][ i ][ j ].kolor[ 0 ] = 5;
            kostka[ i ][ 0 ][ j ].kolor[ 1 ] = 3;
            kostka[ i ][ 2 ][ j ].kolor[ 1 ] = 2;
            kostka[ i ][ j ][ 0 ].kolor[ 2 ] = 4;
            kostka[ i ][ j ][ 2 ].kolor[ 2 ] = 1;
           
            if(( i == 0 && j == 0 ) ||( i == 0 && j == 2 ) ||( i == 2 && j == 0 ) ||( i == 2 && j == 2 ) ) {
                kostka[ i ][ j ][ 0 ].iloscScian = trzy;
                kostka[ i ][ j ][ 2 ].iloscScian = trzy;
            }
        }
    }
}

C/C++
enum iloscScian {
    jedna,
    dwie,
    trzy
};

struct elementKostki
{
    int kolor[ 3 ];
    iloscScian iloscScian;
    int numerElementu;
};


extern elementKostki kostka[ 3 ][ 3 ][ 3 ];

extern void GenerujKostke();


Edit: Poprawiłem kod o wywołanie funkcji "GenerujKostke();", kolory się pojawiły, ale niestety, są źle wyświetlane i kostka wygląda krótko mówiąc okrutnie.
Screenshot:
http://s29.postimg.org​/7k6pldubr/kostka_glut.png
P-140485
Gabes
» 2015-11-21 15:35:27
Należy włączyć wyświetlanie głębokości
glEnable( GL_DEPTH_TEST );
P-140493
veelenar
Temat założony przez niniejszego użytkownika
» 2015-11-21 16:03:46
Dziękuję!!! Teraz działa jak natura chciała! Dla ciekawskich wstawiam kod źródłowy funkcji Display() :)


C/C++
void Display()
{
    // kolor tła - zawartość bufora koloru
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
   
    // czyszczenie bufora koloru
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //czyści bufory
    // 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, -( neaar + faar ) / 2 );
   
    // przesunięcie obiektu - ruch myszką
    glTranslatef( translatex, translatey, 0.0 );
   
    // skalowanie obiektu - klawisze "+" i "-"
    glScalef( scale, scale, scale );
   
    // obroty obiektu - klawisze kursora
    glRotatef( rotatex, 1.0, 0, 0 );
    glRotatef( rotatey, 0, 1.0, 0 );
   
   
   
    GenerujKostke();
   
    // włączenie testu bufora głębokości
    glEnable( GL_DEPTH_TEST );
   
    for( int x = 0; x < 3; x++ ) {
        for( int y = 0; y < 3; y++ ) {
            for( int z = 0; z < 3; z++ ) {
                int * kolor = kostka[ x ][ y ][ z ].kolor;
                RysujSzescian( x * 0.6f - 0.6f,( y *- 0.6f ) + 0.6,( z *- 0.6f ) + 0.6f, kolor[ 0 ], kolor[ 1 ], kolor[ 2 ] );
            }
        }
    }
   
   
    // skierowanie poleceń do wykonania
    glFlush();
   
    // zamiana buforów koloru
    glutSwapBuffers();
}
P-140495
« 1 »
  Strona 1 z 1