Zaawansowany silnik graficzny 3D napisany w C z wykorzystaniem SDL2, oferujący zarówno projekcję perspektywiczną jak i ortograficzną, system fizyki oraz kontrolę w stylu FPS.
- Funkcje
- Wymagania
- Instalacja
- Kompilacja
- Sterowanie
- Architektura
- Szczegóły Techniczne
- Roadmap
- Licencja
-
✅ Dual Projection System
- Projekcja perspektywiczna z dynamicznym FOV (30° - 120°)
- Projekcja ortograficzna z regulowaną skalą
- Płynne przełączanie między trybami (klawisz
Q)
-
✅ Advanced Camera System
- Kamera FPS z kontrolą myszy i klawiaturą
- Rotacja yaw/pitch z zabezpieczeniem przed gimbal lock
- Smooth mouse look z regulowaną czułością
- Dynamiczny FOV (Field of View)
-
✅ Rendering Pipeline
- Near/Far plane clipping (0.02 - 500 jednostek)
- Przestrzeń kamery z transformacjami 3D
- Grubo-liniowy rendering (3px) dla lepszej widoczności
- Optymalizacja odrzucania obiektów poza frustum
- ✅ Physics Engine
- Symulacja grawitacji (-9.81 m/s²)
- Kolizje z podłogą z odbiciami
- Tłumienie prędkości (friction)
- Delta-time based physics dla płynnej animacji
- System sił i mas dla obiektów fizycznych
-
✅ 3D Grid & Axes
- Siatka podłogi 20x20 jednostek
- Kolorowe osie współrzędnych (RGB = XYZ)
- Znaczniki co 1 jednostkę z etykietami tekstowymi
- Dynamiczne renderowanie tekstu TTF
-
✅ UI Elements
- Renderowanie tekstu w przestrzeni 3D
- Etykiety osi z kolorem RGB
- Adaptacyjne skalowanie UI
# Arch Linux
sudo pacman -S sdl2 sdl2_ttf gcc make pkg-config
# Ubuntu/Debian
sudo apt install libsdl2-dev libsdl2-ttf-dev gcc make pkg-config
# Fedora
sudo dnf install SDL2-devel SDL2_ttf-devel gcc make pkgconfig- Kompilator: GCC 7.0+
- SDL2: ≥ 2.0.0
- SDL2_ttf: ≥ 2.0.0
- System: Linux (testowane na Arch Linux KDE)
- Czcionka:
/usr/share/fonts/TTF/Hack-Regular.ttf(lub inna czcionka TTF)
# Klonowanie repozytorium
git clone https://github.com/dg-neural-23/physic-engine-c-sml2.git
cd physic-engine-c-sml2
# Instalacja zależności (Arch Linux)
sudo pacman -S sdl2 sdl2_ttf# Kompilacja projektu
make
# Uruchomienie
./raytracing
# Czyszczenie plików binarnych
make cleanCC = gcc
CFLAGS = -Wall -g $(shell pkg-config --cflags SDL2_ttf)
LIBS = -lSDL2 -lm $(shell pkg-config --libs SDL2_ttf)| Akcja | Funkcja |
|---|---|
| Ruch myszy | Rozglądanie się (FPS look) |
| Czułość | 0.1° na pixel |
| Klawisz | Kierunek |
|---|---|
| Z | Do przodu (+Z) |
| A | Do tyłu (-Z) |
| X | W lewo (-X) |
| S | W prawo (+X) |
| C | Do góry (+Y) |
| D | Do dołu (-Y) |
| Klawisz | Rotacja |
|---|---|
| V | Pitch up (w górę) |
| F | Pitch down (w dół) |
| B | Yaw left (w lewo) |
| G | Yaw right (w prawo) |
| Klawisz | Funkcja |
|---|---|
| Q | Przełącznik Perspektywa ↔ Ortho |
| W | FOV + (wider view, 120° max) |
| E | FOV - (zoom in, 30° min) |
- Prędkość ruchu: 1.0 jednostka/klatkę
- Prędkość rotacji: 2.0°/klatkę
- Czułość myszy: 0.1°/pixel
typedef struct {
float x, y, z;
} Vertex;
typedef struct {
Vertex position; // Pozycja w świecie
Vertex velocity; // Prędkość [m/s]
Vertex force; // Siła [N]
float mass; // Masa [kg]
} PhysicsObject;
typedef struct {
PhysicsObject physics;
float yaw; // Rotacja Y [-180°, 180°]
float pitch; // Rotacja X [-89°, 89°]
float fov; // Field of View [30°, 120°]
} Camera;World Space
↓
[Translate to Camera]
↓
Camera Space
↓
[Rotate by Yaw/Pitch]
↓
View Space
↓
[Clip to Near/Far]
↓
[Perspective Divide]
↓
NDC (Normalized Device Coords)
↓
[Viewport Transform]
↓
Screen Space
-
Physics Engine (
updatePhysics)- Integracja Eulera
- F = ma
- Kolizje z podłogą
-
Projection System
projectOrtho()- Projekcja ortograficznaproject()- Projekcja perspektywicznatoCameraSpace()- Transformacja do przestrzeni kameryclipLineToNearFar()- Clipping frustum
-
Rendering
drawThickLine()- Rysowanie linii 3pxdrawFloor()- Siatka podłogidrawAxesWithLabels()- Osie 3D z etykietamirenderText()- Tekst w przestrzeni 3D
// FOV-based perspective projection
float aspect = WIDTH / HEIGHT;
float fovRad = camera.fov * (PI / 180.0f);
float tanHalf = tan(fovRad * 0.5f);
float x_ndc = r.x / (r.z * tanHalf * aspect);
float y_ndc = -r.y / (r.z * tanHalf);
screen_x = (x_ndc + 1.0) * 0.5 * WIDTH;
screen_y = (y_ndc + 1.0) * 0.5 * HEIGHT;| Parametr | Wartość |
|---|---|
| Grawitacja | -9.81 m/s² |
| Wysokość podłogi | 0.0m |
| Współczynnik odbicia | 0.5 |
| Tarcie | 0.9 |
| Threshold zatrzymania | 0.1 m/s |
| Plane | Wartość |
|---|---|
| Near Plane | 0.02 jednostki |
| Far Plane | 500.0 jednostek |
| Parametr | Default | Range |
|---|---|---|
| Position | (5, 1.7, -10) | Unlimited |
| FOV | 90° | 30° - 120° |
| Pitch | 0° | -89° do 89° |
| Yaw | 0° | -180° do 180° |
- Renderowanie sześcianów 3D
- System materiałów i kolorów
- Zaawansowane oświetlenie (ambient, diffuse)
- Ray tracing dla cieni
- Tekstury i UV mapping
- Import modeli OBJ
- Skybox
- Particle system
- Collision detection między obiektami
- Post-processing effects
- FPS: 60 (VSync enabled)
- Frame time: ~16ms
- Resolution: 900x600
- Draw calls: ~400-500 linii/klatkę
- ✅ Frustum culling
- ✅ VSync dla stabilnego framerate
- ✅ Delta-time physics
- ✅ Thick line batching
- Brak obsługi wielu obiektów
- Czcionka zakodowana na sztywno (
/usr/share/fonts/TTF/Hack-Regular.ttf) - Brak menu konfiguracji
- Gimbal lock przy pitch = ±90°
Pull requesty mile widziane! Dla większych zmian, proszę najpierw otworzyć issue.
# Fork projektu
git checkout -b feature/AmazingFeature
git commit -m 'Add some AmazingFeature'
git push origin feature/AmazingFeature
# Otwórz Pull RequestMIT License - zobacz plik LICENSE dla szczegółów.
dg-neural-23
- GitHub: @dg-neural-23
- Projekt: physic-engine-c-sml2
- SDL2 - Simple DirectMedia Layer
- SDL2_ttf - TrueType Font rendering
- Hack Font - Domyślna czcionka projektu
- Społeczność Arch Linux KDE
⭐ Jeśli podoba Ci się ten projekt, zostaw gwiazdkę! ⭐
Made with ❤️ using C and SDL2