Analisis mendalam tentang bagaimana kode grafgameN_8_5-5d.html menerjemahkan gerakan fisik tangan menjadi input game.
Click here for English
Kode ini menggunakan dua pustaka Open Source dari Google yang dimuat melalui CDN (Content Delivery Network). Ini memungkinkan AI berjalan langsung di browser tanpa perlu server backend.
Mesin pembelajaran mesin (Machine Learning) yang memanfaatkan akselerasi hardware (WebGL) pada kartu grafis komputer Anda untuk melakukan perhitungan matematika berat di browser.
<script src=".../tfjs"></script>
Jaringan saraf tiruan yang sudah dilatih sebelumnya (pre-trained). Model ini menerima gambar video dan memprediksi 21 titik koordinat 3D kerangka tangan manusia.
<script src=".../handpose"></script>
Tantangan utama dalam input webcam adalah "jitter" (tangan yang gemetar). Kode ini menggunakan teknik rata-rata untuk menstabilkan input.
Alih-alih melacak ujung jari (yang sering bergerak-gerak), kode ini melacak Sendi MCP (Buku Jari) yang lebih stabil secara anatomis.
Ketiga titik tersebut dirata-ratakan untuk menghasilkan satu Control Point yang stabil.
const landmarkIndices = [5, 9, 13];
// Menghitung rata-rata posisi X dan Y
controlPointX = totalX / 3;
controlPointY = totalY / 3;
// PENTING: Membalik koordinat X (Cermin)
mirroredX = videoWidth - controlPointX;
Inovasi utama dalam kode ini adalah penggunaan Buffer Riwayat (History Buffer). Kode tidak melihat "di mana tangan berada", melainkan "ke mana tangan bergerak" dalam 500ms terakhir.
Variabel controlPointHistory menyimpan daftar posisi dan waktu. Data yang lebih tua dari 0.5 detik dihapus.
Kode menghitung selisih jarak (Delta) antara titik terlama di memori dengan titik saat ini.
// X dihitung terbalik karena efek cermin
diffX = oldestPoint.x - currentPoint.x;
// Y standar (Ke bawah = Positif)
diffY = currentPoint.y - oldestPoint.y;
// Batas minimum gerakan agar dianggap swipe
const threshold = 25; // Pixel
Kode membandingkan besarnya perubahan horizontal vs vertikal untuk menentukan input game.
IDLE (0).
abs(diffX) > abs(diffY)?
Diagram interaktif di bawah ini mensimulasikan bagaimana kode menerjemahkan vektor gerakan fisik menjadi data. Garis Putus-putus Hijau mewakili data yang tersimpan di controlPointHistory.
Bagaimana logika AI ini disisipkan ke dalam game tanpa membuat game menjadi lambat (lag)?
requestAnimationFrame(gameLoop);
function gameLoop(now) {
// 1. Jalankan CV secara Asynchronous (Promise)
// Ini mencegah game berhenti saat AI berpikir
model.estimateHands(video).then( preds => {
direction = getMotionDirection(now);
// Logika Persistensi (Penyimpanan Status)
if (direction !== 0) {
// Jika tangan terdeteksi bergerak, simpan arahnya
lastValidDirection = direction;
arah_gelinding = direction;
} else {
// Jika tangan berhenti atau hilang,
// gunakan arah valid terakhir agar bola tetap jalan.
arah_gelinding = lastValidDirection;
}
});
// 2. Update Logika Game & Gambar Canvas
// ... kode menggambar bola ...
}