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)
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
}