Wróć do projektów
Game Development · Grafika 3D
2026 Akademia Tarnowska

Racing 3D

Autorski silnik wyścigowy napisany w C++ i OpenGL 3.3 — od renderowania shaderów po symulację fizyki Bullet Physics.

C++17
Język
OpenGL 3.3
Grafika
60+ FPS
Wydajność
3 osoby
Zespół

Autorski silnik
od zera

Kluczowym założeniem było stworzenie trójwymiarowego symulatora wyścigów bez użycia gotowych silników jak Unity czy Unreal Engine. Cały potok renderowania, fizyka i logika gry zostały napisane w C++17 od podstaw.

Projekt był realizowany w ramach przedmiotu Grafika 3D i programowanie kart graficznych na Akademii Tarnowskiej.

🎮
Rozbudowane menu
Wybór auta, trasy, liczby okrążeń i ustawień grafiki
📷
Dwa tryby kamery
TPP (za samochodem) i FPP (widok z kokpitu)
🤖
Przeciwnik AI
System waypointów z algorytmem P-Controller
💰
System ekonomii
Wirtualna waluta, garaż z 7 samochodami do odblokowania
🔊
Dynamiczny dźwięk
Pitch silnika zmienia się proporcjonalnie do prędkości

Stack technologiczny

⚙️
C++17
Język główny. Pełna kontrola pamięci i wydajność wymagana w aplikacjach czasu rzeczywistego.
🖥️
OpenGL 3.3
Core Profile — nowoczesny potok renderowania z shaderami GLSL, VBO/VAO/EBO.
🧮
Bullet Physics
Symulacja fizyki bryły sztywnej. Model btRaycastVehicle z zawieszeniem i tarciem opon.
🪟
GLFW + GLAD
Tworzenie okna, kontekstu OpenGL i obsługa urządzeń wejścia.
📐
GLM
Biblioteka matematyczna — wektory, macierze transformacji, rzutowanie perspektywiczne.
🖱️
ImGui
Immediate Mode GUI — menu, HUD z licznikiem prędkości, ekrany końcowe.
🔈
Miniaudio
Lekka biblioteka audio do odtwarzania dźwięku silnika z dynamicznym pitchem.
📦
CMake + vcpkg
System budowania i zarządzanie zależnościami niezależny od IDE.

Jak to działa

01
Maszyna stanów

Aplikacja działa w trzech stanach: SPLASH_SCREEN, MAIN_MENU i RACING. Każdy stan determinuje co jest renderowane w danej klatce.

enum GameState {
  SPLASH_SCREEN,
  MAIN_MENU,
  RACING
};
02
Pętla gry + Delta Time

Każda klatka: przetwarzanie wejścia → aktualizacja fizyki → renderowanie. Delta Time zapewnia tę samą prędkość gry na 30 i 144 FPS.

float deltaTime =
  currentFrame - lastFrame;
// ruch * deltaTime = m/s
03
Shader Phonga (GLSL)

Model oświetlenia z trzema składnikami: ambient, diffuse, specular. Autorskie shadery phong.vert i phong.frag.

vec3 result =
  (ambient + diffuse
   + specular)
  * texColor.rgb;
04
Własny parser OBJ

Klasa Karting parsuje format Wavefront OBJ linia po linii, z automatycznym generowaniem normalnych przez iloczyn wektorowy.

glm::vec3 n =
  glm::normalize(
    glm::cross(
      v1-v0, v2-v0));
05
Fizyka — btRaycastVehicle

Każde koło rzuca promień (raycast) do podłoża. Siła zawieszenia, tarcie i silnik są obliczane osobno dla każdego koła przez Bullet Physics.

vehicle->applyEngineForce(
  force, 2); // tylna oś
vehicle->setSteeringValue(
  val, 0);   // przednia oś
06
AI — Waypoints + P-Controller

Przeciwnik podąża za punktami nawigacyjnymi toru. Kąt skrętu obliczany przez atan2 i ograniczany przez glm::clamp.

float steering =
  glm::clamp(
    angleDiff / 30.0f,
    -1.0f, 1.0f);

Klawiatura

WPrzyspieszenie
SHamowanie / Wsteczny
ASkręt w lewo
DSkręt w prawo
SPACJAHamulec ręczny (drift)
CZmiana kamery TPP / FPP
ESCMenu / Pauza
Alternatywne sterowanie

Jak uruchomić

Wymagania
Windows 10/11 Visual Studio 2019/2022 CMake ≥ 3.16 Ninja OpenGL kompatybilne GPU
1
Klonuj repozytorium
git clone https://github.com/Andrii418/Racing3D.git
cd Racing3D
2
Zainstaluj zależności przez vcpkg
.\vcpkg\vcpkg install glfw3 glm glew --triplet x64-windows
3
Skonfiguruj i zbuduj projekt
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_TOOLCHAIN_FILE=.\vcpkg\scripts\buildsystems\vcpkg.cmake
cmake --build build --config Release
4
Uruchom grę
.\build\Racing3D.exe
Wszystkie projekty