diff --git a/main.cpp b/main.cpp index e506446..3b0f5b6 100644 --- a/main.cpp +++ b/main.cpp @@ -116,10 +116,11 @@ float Sides = -45.0f; // Pozycja łazika w lewo/prawo float Rotation = 270.0f; // Rotacja łazika (w stopniach) +bool fpv_view = false; // Flaga widoku z pierwszej osoby const float MinDistance = 20.0f; const float MaxDistance = 1000.0f; -float CameraHeight = 50.0f; // Wysokość kamery +float CameraHeight = 150.0f; // Wysokość kamery float MoveSpeed = 0.5f; // Prędkość poruszania się @@ -551,36 +552,47 @@ void static RenderScene(void) { float rad = Rotation * GL_PI / 180.0f; if (panoramic_view) { - // --- WIDOK Z GÓRY (STRATEGICZNY) --- + // --- WIDOK Z GÓRY --- maxRotationSpeed = 1.0f; rotationFriction = 0.5f; - - float mapZoom = 400.0f; // Wysokość, z której patrzymy - gluLookAt( - Foward, mapZoom, Sides, // Kamera wysoko nad łazikiem - Foward, 0.0f, Sides, // Patrzymy prosto na łazik - 1.0f, 0.0f, 0.0f // ZMIANA: Wektor góry to oś X (bo patrzymy w dół osi Y) - ); + float mapZoom = 400.0f; + gluLookAt(Foward, mapZoom, Sides, Foward, 0.0f, Sides, 1.0f, 0.0f, 0.0f); } - else { + else if (fpv_view) { + // --- WIDOK FIRST PERSON (FPV) --- maxRotationSpeed = 0.5f; rotationFriction = 0.1f; float rad = Rotation * GL_PI / 180.0f; - // Obliczamy pozycję kamery korzystając z dynamicznego CameraDistance - float camX = Foward + CameraHeight * sin(rad); - float camZ = Sides + CameraHeight * cos(rad); + // Pozycja oczu: środek łazika + lekko w górę + float eyeX = Foward; + float eyeY = 15.0f; // Wysokość "oczu" nad ziemią + float eyeZ = Sides; - // Wysokość kamery też może się skalować z dystansem (opcjonalnie) - float dynamicHeight = CameraHeight * 0.4f; + // Kierunek patrzenia: zgodnie z rotacją łazika + // Używamy ujemnego sin/cos, bo w Twoim kodzie Rotation steruje modelem w ten sposób + float lookAtX = Foward - 10.0f * sin(rad); + float lookAtZ = Sides - 10.0f * cos(rad); gluLookAt( - camX, dynamicHeight, camZ, // Pozycja kamery - Foward, 10.0f, Sides, // Patrzymy na łazik - 0.0f, 1.0f, 0.0f // Góra + eyeX, eyeY, eyeZ, // Oko jest wewnątrz/nad łazikiem + lookAtX, eyeY, lookAtZ, // Patrzymy przed siebie (na tej samej wysokości) + 0.0f, 1.0f, 0.0f // Góra to oś Y ); } + else { + // --- WIDOK TRZECIOOSOBOWY (TPP) --- + maxRotationSpeed = 0.5f; + rotationFriction = 0.1f; + float rad = Rotation * GL_PI / 180.0f; + float camX = Foward + CameraHeight * sin(rad); + float camZ = Sides + CameraHeight * cos(rad); + float dynamicHeight = CameraHeight * 0.4f; + + gluLookAt(camX, dynamicHeight, camZ, Foward, 10.0f, Sides, 0.0f, 1.0f, 0.0f); + + } // Rysowanie mapy @@ -1004,7 +1016,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case 'D': keyDPressed = false; break; - + case 112: // F1 - Widok z pierwszej osoby (FPV) + fpv_view = !fpv_view; + if (fpv_view) panoramic_view = false; // Wyłącz panoramę, jeśli włączasz FPV + break; // Obsługa innych klawiszy }