Visualisasi paradoks Zeno pake OpenGL. Konsepnya diambil dari jurus Infinity nya Gojo di JJK - dimana makin deket ke target, makin lambat geraknya sampe ga pernah nyampe.
Jadi ada cube (projectile) yang terbang ke arah sphere (Gojo). Kalo infinity nyala, si cube cuma bisa maju 5% dari sisa jarak tiap frame-nya. Jadinya makin lama makin lambat, secara teori ga bakal pernah nyentuh.
Kalo infinity mati ya nabrak biasa aja.
Ini basically visualisasi dari paradoks matematika klasik - kalo mau jalan dari A ke B, harus lewatin setengah jarak dulu, terus setengahnya lagi, terus setengahnya lagi... sampe infinity. Tapi kenyataannya limit-nya tetep ada (converge).
# install dulu (linux)
sudo apt install freeglut3-dev libgl1-mesa-dev cmake
# compile
mkdir build && cd build
cmake .. && make
# jalanin
./zenos| Key | Fungsi |
|---|---|
| Spasi | Nyalain/matiin infinity |
| R | Reset ulang posisi cube |
| P | Pause/resume simulasi |
| ESC | Cabut |
| Key | Fungsi |
|---|---|
| 1 | Mode FREE - kontrol manual |
| 2 | Mode FOLLOW - track projectile |
| 3 | Mode AUTO-ORBIT - orbit otomatis |
| C | Reset kamera ke default |
| Scroll | Zoom in/out |
| Drag kiri | Rotasi kamera keliling |
| Drag kanan | Geser kamera |
| Arrow keys | Geser kamera juga |
Program ini dilengkapi efek visual yang bikin makin immersive:
Barrier Effects:
- Particle System - Partikel mengambang di sekitar barrier
- Energy Rings - Ring energi expanding saat infinity aktif
- Aura Rings - Hexagonal rings yang rotating
Projectile Effects:
- Energy Trail - Jejak energi fading di belakang projectile
- Glow Effect - Soft glow di sekeliling Gojo body
Impact Effects (Enhanced!):
- Explosion Particles - Debris beterbangan dengan physics (gravity + bounce)
- Shockwave Rings - Multiple expanding rings dari titik impact
- Flying Sparks - Percikan api dengan trailing lines
- Explosion Glow - Glowing sphere yang expanding dan fade
- Radial Flash - Flash effect dengan gradient dari center screen
- Camera Shake - Screen shake intensif saat impact
Camera System:
- Smooth Interpolation - Gerakan kamera pake lerp
- 3 Camera Modes - Free, Follow, Auto-orbit
zenos/
├── CMakeLists.txt # config cmake
├── include/
│ ├── physics.h # struct GameState, class Physics
│ └── renderer.h # class Renderer, camera modes, effects
└── src/
├── main.cpp # setup GLUT, callbacks input
├── physics.cpp # update posisi, math zeno
└── renderer.cpp # render OpenGL, effects, camera system
Nyimpen semua data simulasi:
gojoZ,objectZ- posisi di sumbu ZisInfinityActive- barrier nyala apa enggaisImpact- udah nabrak belumzenoSteps- udah berapa kali iterasitotalTraveled- total jarak yg udah ditempuhcurrentVelocity- kecepatan frame ini
3 mode kamera tersedia:
CAM_FREE- User control penuh (default)CAM_FOLLOW- Otomatis track projectileCAM_AUTO_ORBIT- Orbit otomatis keliling scene
Features:
- Smooth interpolation pake lerp
- Camera shake saat impact
- Spherical coordinates untuk rotation
| Effect | Teknik |
|---|---|
| Barrier Particles | Point sprites + additive blending |
| Energy Trail | Line strip + vertex alpha fade |
| Glow | Multiple layered spheres + additive blend |
| Distortion Rings | Line loops + pulsating animation |
| Impact Flash | Fullscreen quad + fade decay |
| Aura Rings | Rotating hex patterns |
Inti logikanya:
// kalo infinity nyala
if (isInfinityActive) {
gap = jarak_sekarang - safe_distance;
velocity = gap * 0.05; // maju 5% dari sisa
objectZ -= velocity;
}
// kalo mati
else {
velocity = 0.2; // konstan
objectZ -= velocity;
// cek nabrak
}Safe distance = 3.1 (radius barrier 2.5 + radius object 0.6). Jadi cube berhenti sebelum masuk barrier.
Pas jalan, di kiri bawah ada info:
- Camera mode (FREE/FOLLOW/AUTO-ORBIT)
- Status infinity (aktif/non-aktif, warna ijo/abu)
- Jarak total ke gojo
- Sisa jarak ke barrier (converge ke 0)
- Velocity sekarang (makin kecil)
- Jumlah steps/iterasi
Di kanan atas ada kontrol hints.
Kalo infinity mati dan nabrak, muncul "IMPACT DETECTED" warna merah + flash effect.
| Apa | Nilai |
|---|---|
| Posisi awal cube | z = 15 |
| Posisi gojo | z = 0 |
| Radius barrier | 2.5 |
| Radius object | 0.6 |
| Safe distance | 3.1 |
| Zeno fraction | 5% |
| Normal velocity | 0.2/frame |
| Texture size | 256x256 |
| Max particles | 200 |
| Max trail points | 30 |
| Target FPS | 60 |
- OpenGL
- GLUT (freeglut di linux)
- CMake 3.10+
- Compiler C++17
Buat tugas/belajar OpenGL + matematika.