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

Problem z przykładowym programem do wczytywania obj

Ostatnio zmodyfikowano 2012-01-14 18:22
Autor Wiadomość
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?

C/C++
/*
(c) Janusz Ganczarski
http://www.januszg.hg.pl
JanuszG@enter.net.pl
*/

#include <GL/glut.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <stdio.h>
#include "obj.h"
#include <iostream>


// 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 neara = 10.0;
const GLdouble fara = 30.0;

// kąty obrotu obiektu

GLfloat rotatex = 0.0;
GLfloat rotatey = 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;

// współczynnik skalowania

GLfloat scale = 1.0;

// wektory przesunięcia

GLfloat translatex = 0.0;
GLfloat translatey = 0.0;

// identyfikator listy wyświetlania z obiektem

GLuint OBJECT_LIST[ 5 ];

// funkcja generująca scenę 3D

void Display()
{
    // kolor tła - zawartość bufora koloru
    glClearColor( 3.0, 3.0, 1.0, 1.0 );
   
    // czyszczenie bufora koloru i bufora głębokości
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   
    // wybór macierzy modelowania
    glMatrixMode( GL_MODELVIEW );
   
    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();
   
    // włączenie testu bufora głębokości
    glEnable( GL_DEPTH_TEST );
   
    // przesunięcie układu współrzędnych obiektu do środka bryły odcinania
    glTranslatef( 0, 0, -( neara + fara ) / 2 );
   
    // przesunięcie obiektu
   
    glTranslatef( translatex, translatey, 0.0 );
   
    // obroty obiektu
    glRotatef( rotatex, 1.0, 0.0, 0.0 );
    glRotatef( rotatey, 0.0, 1.0, 0.0 );
   
    // skalowanie obiektu - klawisze "+" i "-"
    glScalef( scale, scale, scale );
   
    // ustawienie parametrów modelu oświetlenia
    glLightModelf( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE );
   
    // włączenie oświetlenia
    glEnable( GL_LIGHTING );
   
    // włączenie światła GL_LIGHT0 z parametrami domyślnymi
    glEnable( GL_LIGHT0 );
   
    // włączenie automatycznej normalizacji wektorów normalnych
    glEnable( GL_NORMALIZE );
   
    // tryb renderingu wielokątów
    glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
   
    // wyświetlenie listy wyświetlania z obiektem
    for( int i = 0; i <= 5; i++ )
    {
        glCallList( OBJECT_LIST[ i ] );
       
    }
   
    // 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, neara, fara );
        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, neara, fara );
       
    }
    else
         glFrustum( left, right, bottom, top, neara, fara );
   
    // generowanie sceny 3D
    Display();
}

void SpecialKeys( int key, int x, int y )
{
    switch( key )
    {
        // kursor w górę
    case GLUT_KEY_UP:
        translatey += 0.5;
        break;
       
        // kursor w dół
    case GLUT_KEY_DOWN:
        translatey -= 0.5;
        break;
       
        // kursor w lewo
    case GLUT_KEY_LEFT:
        translatex -= 0.5;
        break;
       
        // kursor w prawo
    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;
    }
   
    // odrysowanie okna
    glutPostRedisplay();
}

// obsługa klawiatury

void Keyboard( unsigned char key, int x, int y )
{
    // klawisz +
    if( key == '+' )
         scale += 0.01;
    else
   
    // klawisz -
    if( key == '-' && scale > 0.01 )
         scale -= 0.01;
   
    // narysowanie sceny
    Display();
}

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

// 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 | GLUT_DEPTH );
   
    // rozmiary głównego okna programu
    glutInitWindowSize( 500, 500 );
   
    // utworzenie głównego okna programu
    glutCreateWindow( "Symulator pracy farmera" );
   
    // 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 menu podręcznego
    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 );
   
    // menu główne
    glutCreateMenu( Menu );
   
    #ifdef WIN32
    glutAddSubMenu( "Aspekt obrazu", MenuAspect );
    glutAddMenuEntry( "Wyjście", EXIT );
    #else
    glutAddSubMenu( "Aspekt obrazu", MenuAspect );
    glutAddMenuEntry( "Wyjscie", EXIT );
    #endif
   
    // określenie przycisku myszki obsługującej menu podręczne
    glutAttachMenu( GLUT_RIGHT_BUTTON );
   
    // funkcja bezczynności
    glutIdleFunc( Display );
   
    // wczytanie pliku
   
    for( int i = 0; i <= 5; i++ )
    {
       
       
       
        if( !load_obj( argv[ i ], OBJECT_LIST[ i ] ) )
        {
           
            printf( "Niepoprawny odczyt pliku %s", argv[ i ] );
           
        }
    }
   
   
    // wprowadzenie programu do obsługi pętli komunikatów
    glutMainLoop();
    return 0;
}

[ / code ][ / i ]
P-47868
SeaMonster131
» 2012-01-10 19:50:23
Ustawiasz parametry jednego obiektu, dajesz glLoadIdentity(); dla zresetowania widoku, następnie ustawiasz parametry następnego obiektu.. itd
P-47885
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.
C/C++
if( OBJECT_LIST[ i ] == OBJECT_LIST[ 1 ] )
{
    translatex += 1.0;
    glLoadIdentity();
}
}
P-47894
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

  
C/C++
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:

 
C/C++
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?
P-48199
1 « 2 »
Poprzednia strona Strona 2 z 2