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

Obracanie gracza

Ostatnio zmodyfikowano 2015-05-27 08:24
Autor Wiadomość
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

C/C++
double x;
double y;

glfwGetCursorPos( window, & x, & y ); //pobiera położenie kursora na ekranie

if( x != Globals::screenWidth / 2 && y != Globals::screenHeight / 2 ) //żeby nie liczyc jak stoję
{
   
    MVP.angleXZ( 0.001 *( x - Globals::screenWidth / 2 ) ); //kąt rośnie o stałą * różnicę pozycji kursora i sroka ekranu,
    //na jakiej sie znajdowal wychodzac z funkcji
   
}

glfwSetCursorPos( window, Globals::screenWidth / 2.0f, Globals::screenHeight / 2.0f ); //wraca kursorem na srodek ekranu

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?
P-132707
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.
P-132717
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 ;)
P-132730
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:

C/C++
double x; // aktualna pozycja x kursora
double y; // -||-
static double lX = 0; //poprzednia pozycja x kursora
static double offsetXZ = 0; //pomocnicza zmienna zapisująca kąt w płaszczyźnie XZ, gdy kursor ma opuścić ekran


glfwGetCursorPos( mWindow, & x, & y ); //pobranie pozycji kursora

if( x != lX ) //warunek, żeby nie liczyć jeśli gracz się nie ruszy...
     MVP.setAngleXZ( MVP.startAngleXZ() + offsetXZ +( x - Globals::screenWidth / 2 ) / mSensitivity );

//MVP.setAngleXZ- ustawienie kąta "kamery"
//MVP.startAngleXZ- funkcja zwracająca kąt ustawiony jako początkowy kąt kamery w płaszczyźnie XZ
//offset- kąt zapisany przy przemieszczeni kursora na środek ekranu gdy osiągnie granice okna
//mSensitivity - zmienna zmniejszająca czułość obrotu gracza

if( x <= 0 || x >= Globals::screenWidth || y <= 0 || y >= Globals::screenHeight ) // jak myszka wykroczy poza granice okna
{
   
    offsetXZ += mInversionXZ *( x - Globals::screenWidth / 2 ) / mSensitivity / M_PI; // dodanie do offsetu wartości uzyskanego kąta
    glfwSetCursorPos( mWindow, Globals::screenWidth / 2.0f, Globals::screenHeight / 2.0f ); //przesunięcie kursora na środek ekranu
    glfwGetCursorPos( mWindow, & x, & y ); zapisanie nowej pozycji na ekranie
}

lX = x; // poprzednia pozycja

mam nadzieję, że komuś się przyda
P-132837
« 1 »
  Strona 1 z 1