[SFML, OpenGL, C++] gluUnProject i mapa z szescianów
Ostatnio zmodyfikowano 2013-05-21 16:40
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: 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 ); 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 ) ) { mapa [( int ) 1 ] [( int ) posX / 20 ] [( int ) posZ / 20 ] = 0; } else if( sf::Mouse::isButtonPressed( sf::Mouse::Right ) ) { 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: 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. |
|
DejaVu |
» 2013-05-21 16:40:14 http://cpp0x.pl/kursy/Kurs-SFML-2-0-C++/Podstawy /Bezposredni-dostep-do-klawiatury-myszy-i-joysticka/469Na 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. |
|
« 1 » |