Sterowanie na ocene chyba 5.0 ?
This commit is contained in:
162
main.cpp
162
main.cpp
@@ -76,7 +76,7 @@ int monitormodecounter = 0;
|
|||||||
std::time_t monitormodehelper;
|
std::time_t monitormodehelper;
|
||||||
|
|
||||||
//Zmienne do ruchu ##############################################
|
//Zmienne do ruchu ##############################################
|
||||||
|
/*
|
||||||
float Foward = 0.0f; // Pozycja łazika w przód/tył
|
float Foward = 0.0f; // Pozycja łazika w przód/tył
|
||||||
float Sides = 0.0f; // Pozycja łazika w lewo/prawo
|
float Sides = 0.0f; // Pozycja łazika w lewo/prawo
|
||||||
float Rotation = 0.0f; // Rotacja łazika (w stopniach)
|
float Rotation = 0.0f; // Rotacja łazika (w stopniach)
|
||||||
@@ -110,6 +110,97 @@ void RotateRoverAndCamera(float angle) {
|
|||||||
if (Rotation >= 360.0f) Rotation -= 360.0f;
|
if (Rotation >= 360.0f) Rotation -= 360.0f;
|
||||||
if (Rotation < 0.0f) Rotation += 360.0f;
|
if (Rotation < 0.0f) Rotation += 360.0f;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
//Zmienne do ruchu ##############################################^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool keyWPressed = false;
|
||||||
|
bool keySPressed = false;
|
||||||
|
bool keyAPressed = false;
|
||||||
|
bool keyDPressed = false;
|
||||||
|
|
||||||
|
float Foward = 0.0f; // Pozycja łazika w przód/tył
|
||||||
|
float Sides = 0.0f; // Pozycja łazika w lewo/prawo
|
||||||
|
float Rotation = 0.0f; // Rotacja łazika (w stopniach)
|
||||||
|
|
||||||
|
float CameraHeight = 50.0f; // Wysokość kamery
|
||||||
|
float MoveSpeed = 1.0f; // Prędkość poruszania się
|
||||||
|
|
||||||
|
|
||||||
|
float velocity = 0.0f; // Aktualna prędkość łazika
|
||||||
|
const float friction = 0.1f; // Współczynnik tarcia (μ)
|
||||||
|
const float maxSpeed = 3.0f; // Maksymalna prędkość łazika
|
||||||
|
const float acceleration = 0.1f;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Funkcja do poruszania łazikiem
|
||||||
|
void MoveRover(bool forward) {
|
||||||
|
// Zamieniamy kąt na radiany
|
||||||
|
float radRotation = Rotation * GL_PI / 180.0f;
|
||||||
|
|
||||||
|
// Wektor ruchu w kierunku przód/tył (kierunek łazika)
|
||||||
|
float moveX = cos(radRotation);
|
||||||
|
float moveZ = sin(radRotation);
|
||||||
|
|
||||||
|
// Ruch w przód
|
||||||
|
if (forward) {
|
||||||
|
Sides -= MoveSpeed * moveX;
|
||||||
|
Foward -= MoveSpeed * moveZ;
|
||||||
|
}
|
||||||
|
// Ruch w tył
|
||||||
|
else {
|
||||||
|
Sides += MoveSpeed * moveX;
|
||||||
|
Foward += MoveSpeed * moveZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Funkcja do obracania łazika wokół osi Y
|
||||||
|
void RotateRoverAndCamera(float angle) {
|
||||||
|
Rotation += angle;
|
||||||
|
if (Rotation >= 360.0f) Rotation -= 360.0f;
|
||||||
|
if (Rotation < 0.0f) Rotation += 360.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateRover() {
|
||||||
|
// Przyspieszanie
|
||||||
|
if (keyWPressed) {
|
||||||
|
velocity += acceleration;
|
||||||
|
if (velocity > maxSpeed) velocity = maxSpeed;
|
||||||
|
}
|
||||||
|
else if (keySPressed) {
|
||||||
|
velocity -= acceleration;
|
||||||
|
if (velocity < -maxSpeed) velocity = -maxSpeed;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Hamowanie (wytracanie prędkości z powodu tarcia)
|
||||||
|
if (velocity > 0) {
|
||||||
|
velocity -= friction;
|
||||||
|
if (velocity < 0) velocity = 0;
|
||||||
|
}
|
||||||
|
else if (velocity < 0) {
|
||||||
|
velocity += friction;
|
||||||
|
if (velocity > 0) velocity = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Obracanie
|
||||||
|
if (keyAPressed) {
|
||||||
|
RotateRoverAndCamera(3.0f);
|
||||||
|
}
|
||||||
|
else if (keyDPressed) {
|
||||||
|
RotateRoverAndCamera(-3.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aktualizacja pozycji na podstawie prędkości
|
||||||
|
float radRotation = Rotation * GL_PI / 180.0f;
|
||||||
|
Sides-= velocity * cos(radRotation);
|
||||||
|
Foward-= velocity * sin(radRotation);
|
||||||
|
}
|
||||||
|
|
||||||
// Change viewing volume and viewport. Called when window is resized
|
// Change viewing volume and viewport. Called when window is resized
|
||||||
void ChangeSize(GLsizei w, GLsizei h) {
|
void ChangeSize(GLsizei w, GLsizei h) {
|
||||||
@@ -295,7 +386,7 @@ void SetupRC() {
|
|||||||
// do przepisania kodu na podobny do tego stąd:
|
// do przepisania kodu na podobny do tego stąd:
|
||||||
// https://github.com/opengl-tutorials/ogl/blob/master/tutorial07_model_loading/tutorial07.cpp
|
// https://github.com/opengl-tutorials/ogl/blob/master/tutorial07_model_loading/tutorial07.cpp
|
||||||
timestampedCout("Inicjalizowanie GLFW3...");
|
timestampedCout("Inicjalizowanie GLFW3...");
|
||||||
if(!glfwInit()) {
|
if (!glfwInit()) {
|
||||||
timestampedCout("Failed to initialize GLFW");
|
timestampedCout("Failed to initialize GLFW");
|
||||||
}
|
}
|
||||||
timestampedCout("Zainicjalizowano GLFW3.");
|
timestampedCout("Zainicjalizowano GLFW3.");
|
||||||
@@ -370,9 +461,9 @@ void RenderScene(void) {
|
|||||||
//Sterowanie
|
//Sterowanie
|
||||||
//############################################################################################
|
//############################################################################################
|
||||||
gluLookAt(
|
gluLookAt(
|
||||||
Foward - 50.0f * sin((Rotation + 180.0f) * GL_PI / 180.0f), // Pozycja kamery wokół łazika (w poziomie)
|
Foward - 100.0f * sin((Rotation + 180.0f) * GL_PI / 180.0f), // Pozycja kamery wokół łazika (w poziomie)
|
||||||
CameraHeight, // Wysokość kamery
|
CameraHeight, // Wysokość kamery
|
||||||
Sides - 50.0f * cos((Rotation + 180.0f) * GL_PI / 180.0f), // Kamera wzdłuż osi X i Z
|
Sides - 100.0f * cos((Rotation + 180.0f) * GL_PI / 180.0f), // Kamera wzdłuż osi X i Z
|
||||||
Foward, 0.0f, Sides, // Punkt, na który patrzy kamera (łazik)
|
Foward, 0.0f, Sides, // Punkt, na który patrzy kamera (łazik)
|
||||||
0.0f, 1.0f, 0.0f // Wektor "góry"
|
0.0f, 1.0f, 0.0f // Wektor "góry"
|
||||||
);
|
);
|
||||||
@@ -385,10 +476,12 @@ void RenderScene(void) {
|
|||||||
|
|
||||||
// Rysowanie łazika (porusza się i obraca)
|
// Rysowanie łazika (porusza się i obraca)
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
|
||||||
glTranslatef(Foward, 0.0f, Sides); // Translacja łazika na jego pozycję
|
glTranslatef(Foward, 0.0f, Sides); // Translacja łazika na jego pozycję
|
||||||
glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika wokół własnej osi
|
glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika wokół własnej osi
|
||||||
glColor3f(1.0, 0.0, 0.0); // Czerwony kolor dla łazika
|
glColor3f(1.0, 0.0, 0.0); // Czerwony kolor dla łazika
|
||||||
user.draw();
|
user.draw();
|
||||||
|
UpdateRover();
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
|
|
||||||
@@ -487,6 +580,7 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
|
|||||||
WNDCLASS wc; // Windows class structure
|
WNDCLASS wc; // Windows class structure
|
||||||
HWND hWnd; // Storeage for window handle
|
HWND hWnd; // Storeage for window handle
|
||||||
|
|
||||||
|
|
||||||
hInstance = hInst;
|
hInstance = hInst;
|
||||||
|
|
||||||
// Register Window style
|
// Register Window style
|
||||||
@@ -528,6 +622,8 @@ int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
|
|||||||
if (hWnd == NULL) return FALSE;
|
if (hWnd == NULL) return FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
const WORD ID_TIMER = 1;
|
||||||
|
SetTimer(hWnd, ID_TIMER, 100, NULL);
|
||||||
// Display the window
|
// Display the window
|
||||||
ShowWindow(hWnd, SW_SHOW);
|
ShowWindow(hWnd, SW_SHOW);
|
||||||
UpdateWindow(hWnd);
|
UpdateWindow(hWnd);
|
||||||
@@ -547,7 +643,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
static HGLRC hRC; // Permenant Rendering context
|
static HGLRC hRC; // Permenant Rendering context
|
||||||
static HDC hDC; // Private GDI Device context
|
static HDC hDC; // Private GDI Device context
|
||||||
|
|
||||||
float radRotation = Rotation * GL_PI / 180.0f;
|
float radRotation = Rotation * GL_PI / 180.0f;
|
||||||
switch (message) {
|
switch (message) {
|
||||||
// Window creation, setup for OpenGL
|
// Window creation, setup for OpenGL
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
@@ -681,11 +777,31 @@ float radRotation = Rotation * GL_PI / 180.0f;
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case WM_KEYUP:
|
||||||
|
switch (wParam) {
|
||||||
|
case 'W':
|
||||||
|
keyWPressed = false;
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
keySPressed = false;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
keyAPressed = false;
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
keyDPressed = false;
|
||||||
|
break;
|
||||||
|
// Obsługa innych klawiszy
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
// Key press, check for arrow keys to do cube rotation.
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch (wParam) {
|
switch (wParam) {
|
||||||
|
|
||||||
case VK_UP:
|
case VK_UP:
|
||||||
xRot -= 5.0f;
|
xRot -= 5.0f;
|
||||||
break;
|
break;
|
||||||
@@ -721,27 +837,17 @@ float radRotation = Rotation * GL_PI / 180.0f;
|
|||||||
if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!");
|
if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'W': // Ruch w przód
|
case 'W':
|
||||||
MoveRover(true);
|
keyWPressed = true;
|
||||||
break;
|
break;
|
||||||
case 'S': // Ruch w tył
|
case 'S':
|
||||||
MoveRover(false);
|
keySPressed = true;
|
||||||
break;
|
break;
|
||||||
|
case 'A':
|
||||||
case 'A': // Obrót w lewo
|
keyAPressed = true;
|
||||||
RotateRoverAndCamera(5.0f); // Obrót łazika i kamery w lewo
|
|
||||||
break;
|
break;
|
||||||
case 'D': // Obrót w prawo
|
case 'D':
|
||||||
RotateRoverAndCamera(-5.0f); // Obrót łazika i kamery w prawo
|
keyDPressed = true;
|
||||||
break;
|
|
||||||
|
|
||||||
case 'J': // Obrót w lewo (wokół własnej osi)
|
|
||||||
Rotation += 5.0f;
|
|
||||||
if (Rotation > 360.0f || Rotation < 0.0f) Rotation -= 360.0f;
|
|
||||||
break;
|
|
||||||
case 'K': // Obrót w prawo (wokół własnej osi)
|
|
||||||
Rotation -= 5.0f;
|
|
||||||
if (Rotation > 360.0f || Rotation < 0.0f) Rotation += 360.0f;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 114: // F3
|
case 114: // F3
|
||||||
@@ -781,7 +887,13 @@ float radRotation = Rotation * GL_PI / 180.0f;
|
|||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case WM_TIMER:
|
||||||
|
{
|
||||||
|
RenderScene();
|
||||||
|
SwapBuffers(hDC);
|
||||||
|
ValidateRect(hWnd, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: // Passes it on if unproccessed
|
default: // Passes it on if unproccessed
|
||||||
return (DefWindowProc(hWnd, message, wParam, lParam));
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user