feat: first person view at F1

This commit is contained in:
Pc
2026-01-26 19:14:37 +01:00
parent 2602b9a523
commit 739ba9f1a4

View File

@@ -116,10 +116,11 @@ float Sides = -45.0f; // Pozycja łazika w lewo/prawo
float Rotation = 270.0f; // Rotacja łazika (w stopniach) float Rotation = 270.0f; // Rotacja łazika (w stopniach)
bool fpv_view = false; // Flaga widoku z pierwszej osoby
const float MinDistance = 20.0f; const float MinDistance = 20.0f;
const float MaxDistance = 1000.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ę float MoveSpeed = 0.5f; // Prędkość poruszania się
@@ -551,36 +552,47 @@ void static RenderScene(void) {
float rad = Rotation * GL_PI / 180.0f; float rad = Rotation * GL_PI / 180.0f;
if (panoramic_view) { if (panoramic_view) {
// --- WIDOK Z GÓRY (STRATEGICZNY) --- // --- WIDOK Z GÓRY ---
maxRotationSpeed = 1.0f; maxRotationSpeed = 1.0f;
rotationFriction = 0.5f; rotationFriction = 0.5f;
float mapZoom = 400.0f;
float mapZoom = 400.0f; // Wysokość, z której patrzymy gluLookAt(Foward, mapZoom, Sides, Foward, 0.0f, Sides, 1.0f, 0.0f, 0.0f);
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)
);
} }
else { else if (fpv_view) {
// --- WIDOK FIRST PERSON (FPV) ---
maxRotationSpeed = 0.5f; maxRotationSpeed = 0.5f;
rotationFriction = 0.1f; rotationFriction = 0.1f;
float rad = Rotation * GL_PI / 180.0f; float rad = Rotation * GL_PI / 180.0f;
// Obliczamy pozycję kamery korzystając z dynamicznego CameraDistance // Pozycja oczu: środek łazika + lekko w górę
float camX = Foward + CameraHeight * sin(rad); float eyeX = Foward;
float camZ = Sides + CameraHeight * cos(rad); float eyeY = 15.0f; // Wysokość "oczu" nad ziemią
float eyeZ = Sides;
// Wysokość kamery też może się skalować z dystansem (opcjonalnie) // Kierunek patrzenia: zgodnie z rotacją łazika
float dynamicHeight = CameraHeight * 0.4f; // 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( gluLookAt(
camX, dynamicHeight, camZ, // Pozycja kamery eyeX, eyeY, eyeZ, // Oko jest wewnątrz/nad łazikiem
Foward, 10.0f, Sides, // Patrzymy na łazik lookAtX, eyeY, lookAtZ, // Patrzymy przed siebie (na tej samej wysokości)
0.0f, 1.0f, 0.0f // Góra 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 // Rysowanie mapy
@@ -1004,7 +1016,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case 'D': case 'D':
keyDPressed = false; keyDPressed = false;
break; 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 // Obsługa innych klawiszy
} }