Obracanie gracza
Ostatnio zmodyfikowano 2015-05-27 08:24
stevy Temat założony przez niniejszego użytkownika |
Obracanie gracza » 2015-05-24 18:09:20 Witam, mam problem z obracaniem gracza, a w zasadzie ze skalowaniem jego obrotu. Chodzi mniej więcej o to, że w normalnych grach, niezależnie czy ruszymy o taki sam dystans myszką szybko, czy wolno, to kamera obraca się o ten sam kąt (niezależnie czy ruszymy myszką szybko czy wolno o 10 cm w prawo, to postać zrobi np. 1 pełen obrót). Mój problem polega na tym, że używając double x; double y;
glfwGetCursorPos( window, & x, & y );
if( x != Globals::screenWidth / 2 && y != Globals::screenHeight / 2 ) { MVP.angleXZ( 0.001 *( x - Globals::screenWidth / 2 ) ); }
glfwSetCursorPos( window, Globals::screenWidth / 2.0f, Globals::screenHeight / 2.0f );
uzyskuję czasem tą różnicę = 1 przy wolnym ruchu, a przy szybkim np 24, przez co uzyskuję za szybki obrót "kamery". Pytanie moje jest takie: Jak żyć danej funkcji, żeby ruch "kamery" był jednorodny? |
|
stevy Temat założony przez niniejszego użytkownika |
» 2015-05-24 21:20:03 Niech ktoś chociaż napisze, czy nie rozumie pytania, żebym mógł je zadać inaczej, czy jest ono zbyt trudne żeby udzielić krótkiej odpowiedzi. |
|
colorgreen19 |
» 2015-05-25 00:23:07 Kąt rośnie o stałą * jakieś obliczenia na pozycji kursora. Jeśli poruszasz kursorem to jego pozycja jest zmienna wiec nie uzyskasz tego tym sposobem bo stała*zmienna będzie zmienną, nie?
Zrób tak ze jeśli pozycja kursora będzie o ileś pixeli większa od środka ekranu to kąt wzrasta o stałą ilość stopni (i analogicznie się zmniejsza).
Mam nadzieje ze o to chodzi i pomogłem ;) |
|
stevy Temat założony przez niniejszego użytkownika |
» 2015-05-27 08:24:49 znalazłem odpowiedź, była łatwiejsza niż przewidywałem. Opiszę odpowiedź, może komuś się przyda później: double x; double y; static double lX = 0; static double offsetXZ = 0;
glfwGetCursorPos( mWindow, & x, & y );
if( x != lX ) MVP.setAngleXZ( MVP.startAngleXZ() + offsetXZ +( x - Globals::screenWidth / 2 ) / mSensitivity );
if( x <= 0 || x >= Globals::screenWidth || y <= 0 || y >= Globals::screenHeight ) { offsetXZ += mInversionXZ *( x - Globals::screenWidth / 2 ) / mSensitivity / M_PI; glfwSetCursorPos( mWindow, Globals::screenWidth / 2.0f, Globals::screenHeight / 2.0f ); glfwGetCursorPos( mWindow, & x, & y ); zapisanie nowej pozycji na ekranie }
lX = x;
mam nadzieję, że komuś się przyda |
|
« 1 » |