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

[SFML, OpenGL, C++] gluUnProject i mapa z szescianów

Ostatnio zmodyfikowano 2013-05-21 16:40
Autor Wiadomość
intothenether
Temat założony przez niniejszego użytkownika
[SFML, OpenGL, C++] gluUnProject i mapa z szescianów
» 2013-04-18 21:12:25
Witam, chcę zrobić prostą grę w OpenGL'u która ma polegać na stawianiu sześcianów w wybranym miejscu. Mapa w grze jest zrobiona za pomocą zwykłej mapy kafelkowej w 3D która jest zapisana w tablicy. Pozycje na której ma się znaleźć sześcian po kliknięciu ustalam przy pomocy funkcji
gluUnProject();
 która w moim przypadku przyjmuje środek okna jako pierwsze 2 argumenty a trzeci to winZ który zwracam funkcją
glReadPixels();
.
Mój problem polega na tym że funkcja
gluUnProject();
 nie zwraca tych wartości które są mi potrzebne do wpisania indeksów w tablicy, funkcja zwraca koordynaty które określają inny sześcian  niż ten na którym znajduje się kursor( podkreślam że kursor cały czas jest na środku ekranu a widok obracam używając
glRotatef();
. Poniżej podaje kod funkcji odpowiedzialnej za niszczenie 
sześcianów:
C/C++
void Picking( sf::RenderWindow & window )
{
   
    cam.lookx +=( sf::Mouse::getPosition( window ).x - window.getSize().x / 2 );
    cam.looky +=( sf::Mouse::getPosition( window ).y - window.getSize().y / 2 );
    //cam.lookx -= 1.0f;
   
    /*
    */
    GLint viewport[ 4 ];
    GLdouble modelview[ 16 ];
    GLdouble projection[ 16 ];
    GLfloat winX, winY, winZ;
    GLdouble posX, posY, posZ;
    GLdouble posXf, posYf, posZf;
    glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
    glGetDoublev( GL_PROJECTION_MATRIX, projection );
    glGetIntegerv( GL_VIEWPORT, viewport );
   
    winX =( float ) window.getSize().x / 2;
    winY =( float ) viewport[ 3 ] -( float ) window.getSize().y / 2;
    glReadPixels( winX / 20, int( winY ) / 20, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, & winZ );
    gluUnProject( winX / 20,( winY ) / 20, winZ / 20, modelview, projection, viewport, & posX, & posY, & posZ );
    std::cout << 1 << " " <<( int )( posX ) / 20 << " " <<( int )( posZ + cam.looky ) / 20 << std::endl;
    if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
    {
        //cam.z -= (float)cos((float)-cam.lookx*0.0174532925f) * 5.0f;
        //cam.x -= (float)sin((float)-cam.lookx*0.0174532925f) * 5.0f;
        mapa
        [( int ) 1 ]
        [( int ) posX / 20 ]
        [( int ) posZ / 20 ]
        = 0;
    }
    else if( sf::Mouse::isButtonPressed( sf::Mouse::Right ) )
    {
        //cam.z -= (float)cos((float)-cam.lookx*0.0174532925f) * 5.0f;
        //cam.x -= (float)sin((float)-cam.lookx*0.0174532925f) * 5.0f;
        if
        (
        mapa
        [( int ) 1 ]
        [( int ) posX / 20 ]
        [( int ) posZ / 20 ]
        == 0
        )
        mapa
        [( int ) 1 ]
        [( int ) posX / 20 ]
        [( int ) posZ / 20 ]
             = 1;
        else
        if
        (
        mapa
        [( int ) 2 ]
        [( int ) posX / 20 ]
        [( int ) posZ / 20 ]
        == 0
        )
        [( int ) 2 ]
        [( int ) posX / 20 ]
        [( int ) posZ / 20 ]
             = 1;
       
    }
    /*
    */
    mouse.setPosition( sf::Vector2i( window.getSize().x / 2, window.getSize().y / 2 ), window );
}

A tutaj podaję pętle gry w main:
C/C++
while( App.isOpen() )
{
    sf::Event Event;
    while( App.pollEvent( Event ) )
    {
        if( Event.type == sf::Event::Closed )
             App.close();
       
        if( Event.type == sf::Event::Resized )
             glViewport( 0, 0, Event.size.width, Event.size.height );
       
    }
   
    App.setActive();
    App.clear();
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   
    App.popGLStates();
   
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    Move( App );
    TileMap();
    Mouse( App );
   
    App.pushGLStates();
   
    App.display();
}
OpenGL jest dla mnie nowy i zdaję sobie sprawę z tego że coś tutaj robię nie tak ale proszę o pomoc ponieważ bardzo mi na tym zależy.
P-80813
DejaVu
» 2013-05-21 16:40:14
http://cpp0x.pl/kursy/Kurs-SFML-2-0-C++/Podstawy /Bezposredni-dostep-do-klawiatury-myszy-i-joysticka/469

Na dobry początek zapoznaj się z metodą convertCoords, skoro pracujesz z biblioteką SFML. W bibliotece SFML masz kilka różnych układów współrzędnych, które określają położenie obiektów względem różnych elementów 'systemu'. Położenie może być rozpatrywane względem pulpitu, względem okna aplikacji jak również względem kontekstu OpenGL, czyli renderowanej sceny. Mając mysz umiejscowioną na oknie swojej aplikacji możesz odczytać co najmniej trzy różne współrzędne położenia myszy. Ta sama uwaga się tyczy każdego obiektu umieszczonego na scenie, którego chcesz odczytać współrzędne względem np. okna.
P-83518
« 1 »
  Strona 1 z 1