Stiker wajah
Telinga, kacamata, topi, atau masker 2D yang menempel ke 478 titik wajah dan ikut miring serta menoleh.
Make Effect Studio
Stiker wajah, filter warna, ganti latar, partikel, sampai game kecil dengan JavaScript. Kamu membuat dan menguji di browser, tim Make meninjau, lalu semua orang bisa memakainya saat merekam video.
Studio berjalan di browser komputer atau laptop. Di HP, kamu menguji draf lewat kode QR di aplikasi Make.






Satu runtime WebGL + MediaPipe menjalankan efek di browser dan di aplikasi. Semua pemrosesan terjadi di perangkat; gambar kamera tidak pernah dikirim ke server.
Telinga, kacamata, topi, atau masker 2D yang menempel ke 478 titik wajah dan ikut miring serta menoleh.
Model GLB di kepala atau masker 3D di ruang wajah, dengan penghalang kepala supaya terlihat nyata.
LUT 3D (.cube atau PNG), kecerahan, kontras, kehangatan, grain, dan vignette.
Segmentasi tubuh di perangkat untuk latar foto, video, atau blur, plus chroma key untuk kain hijau.
Hati yang keluar saat membuka mulut, kilau saat senyum, cap tanggal, efek suara.
JavaScript di sandbox: sprite, skor, timer, tabrakan, dan endGame. Dikendalikan dengan mulut, kepala, atau tangan.
Setiap proyek baru bisa dimulai dari salah satu template ini. Semua gambar adalah karya asli Make dan suaranya disintesis, jadi boleh kamu ubah dan terbitkan.

Stiker wajah di kepala dan hidung. Buka mulut untuk mengeluarkan hati.
faceSticker2D · particles · mouthOpen
Kacamata yang ikut miring dan menoleh. Senyum untuk kilau dan suara.
faceSticker2D · smile · sound
Latar diganti foto pantai lewat segmentasi. Ketuk untuk latar blur.
background · segmentation · script
LUT warna, grain, vignette, dan cap tanggal.
lut · colorAdjust · text
Game: buah jatuh, buka mulut di dekatnya untuk menangkap. 30 detik.
sprite · ui · script · endGame
Game: miringkan kepala untuk menggerakkan burung dan menghindari batu.
sprite · headTilt · scriptStudio menjalankan validator yang sama dengan server setiap kali kamu mengubah sesuatu. Klik masalahnya untuk melompat ke node, properti, aset, atau baris script.
Draf dikemas jadi .mfx lalu diunggah. Nomor versi yang sama mengganti draf; versi baru harus lebih tinggi dari versi yang terakhir diajukan.
Pemeriksaan otomatis menjalankan semua cek termasuk uji sandbox. "Uji di HP" membuat kode QR pribadi yang berlaku sekitar 10 menit dan hanya bisa dibuka aplikasi Make yang masuk dengan akunmu.
Satu versi per efek bisa ditinjau sekaligus. Kamu bisa menariknya kembali selama belum diputuskan. Penolakan selalu disertai alasan.
Setelah disetujui, efek muncul di katalog dan kamera Makeplay. Video yang dibuat dengannya menampilkan nama efek dan akunmu.
Dokumentasi
Format paketNodePemicuScript APIBatasRuntime dan performaUji dan terbitkanProgram kreatorEfek adalah file zip berekstensi .mfx berisi effect.json (manifest), script.js opsional, dan aset. Setiap file di paket harus terdaftar di assets; file .md, .txt, .json tambahan dan isi src/ diabaikan dengan peringatan. Studio membuat paket ini untukmu.
effect.mfx (zip)
├── effect.json
├── script.js
└── assets/
├── icon.png
├── ears.png
└── …{
"format": 1,
"id": "budi.telinga-kelinci",
"name": "Telinga Kelinci",
"version": "1.0.0",
"description": "Telinga kelinci yang ikut kepala.",
"hint": "Buka mulut!",
"icon": "icon",
"category": "face",
"trackers": ["face"],
"assets": [
{ "id": "icon", "path": "assets/icon.png", "type": "image" },
{ "id": "ears", "path": "assets/ears.png", "type": "image" }
],
"nodes": [
{ "id": "ears", "kind": "faceSticker2D", "asset": "ears",
"anchor": "headTop", "offset": [0, 0.02], "scale": 1.5 }
],
"triggers": []
}Kamera ditampilkan seperti cermin (selfie). Konten yang menempel ikut gambar yang dicerminkan; teks dan UI tidak pernah dicerminkan. Kiri/kanan pada nama titik selalu berarti kiri/kanan orang itu sendiri.
| Ruang | Arti |
|---|---|
x, y | Layar 0..1 dari kiri atas output. |
vh | Ukuran sebagai pecahan tinggi layar, jadi persegi tetap persegi di rasio apa pun. |
face units | Geser dan lebar stiker dalam lebar wajah (telinga ke telinga). |
3D | Sentimeter di ruang kepala: x ke kanan, y ke atas, z ke arah kamera. |
angles | Derajat; di layar, positif = searah jarum jam. |
colors | #rrggbb atau #rrggbbaa. |
| Field | Nilai | Aturan |
|---|---|---|
format | 1 | Versi format, selalu 1. |
id | a-z 0-9 . _ - | 3–64 karakter, diawali huruf atau angka. Studio mengisinya dari slug proyek. |
name | 1–60 | Nama efek yang dilihat pengguna. |
version | 1.2.3 | MAJOR.MINOR.PATCH. Versi baru harus lebih tinggi dari versi yang terakhir diajukan. |
description / hint | ≤ 500 / ≤ 80 | Deskripsi di katalog; petunjuk singkat saat efek dibuka. |
icon | asset id | Aset gambar persegi (256 px disarankan). |
category | face beauty filter background game fun text other | Kategori di katalog. |
trackers | face hands segmentation | Wajib memuat semua tracker yang dibutuhkan node dan pemicu. Tracker yang tidak dipakai jadi peringatan karena memperlambat. |
maxFaces / maxHands | 1–2 | Jumlah wajah atau tangan yang dilacak (bawaan 1). |
assets / nodes / triggers | ≤ 120 / ≤ 128 / ≤ 64 | Pohon node maksimal 6 tingkat. |
script / limits | script.js | Path script di paket dan batas performa (lihat Batas). |
ID aset diawali huruf (A-Z a-z 0-9 _ -, maks. 64). Path relatif dengan garis miring biasa, tanpa ..
| Jenis | File · batas | Pemeriksaan |
|---|---|---|
image | png webp jpg · 4 MB | Maksimal 2048×2048 px; header harus cocok dengan ekstensi. |
model | glb · 8 MB | glTF biner. Satuan dalam cm. |
lut | cube png · 2 MB | .cube 3D (ukuran 2–65) atau PNG 512×512: 8×8 petak 64×64, biru memilih petak, merah = x, hijau = y. |
audio | mp3 m4a ogg wav · 4 MB | Isi file harus cocok dengan ekstensinya. |
video | mp4 webm · 10 MB | Untuk latar video. |
Setiap node punya id unik (diawali huruf), kind, name opsional, visible (bawaan true), z (urutan gambar di lapisannya), dan children. Anak hanya mewarisi visibilitas, bukan posisi.
Urutan gambar: kamera/latar/LUT/warna → model 3D → stiker wajah → sprite → partikel → teks/UI.
| Jangkar | Titik |
|---|---|
noseTip betweenEyes forehead headTop chin faceCenter | Garis tengah wajah (headTop diperkirakan di atas dahi). |
leftEye rightEye leftEyebrow rightEyebrow leftCheek rightCheek leftEar rightEar | Sisi kiri/kanan orang itu sendiri. |
upperLip lowerLip mouthCenter mouthLeft mouthRight | Mulut. |
landmark:<0-477> | Indeks mentah face mesh MediaPipe. |
hand:wrist hand:palm hand:thumbTip hand:indexTip hand:middleTip | Tangan pertama yang terdeteksi (butuh tracker hands). |
screen | Posisi layar (position). |
| kind | Field | Kegunaan |
|---|---|---|
faceSticker2D | asset anchor offset scale rotation followRotation followYaw opacity face | Gambar yang menempel ke titik wajah atau tangan, ikut miring dan menoleh. |
model3D | asset anchor offset[cm] rotation scale face | Model GLB pada pose kepala. |
faceMesh3D | asset occluder scale face | GLB di ruang wajah kanonik MediaPipe (masker), dengan penghalang kepala. |
lut | asset intensity | Filter warna LUT 3D. Satu per efek. |
colorAdjust | brightness contrast saturation warmth grain vignette | Atur warna -1..1, grain dan vignette 0..1. Satu per efek. |
background | mode image|video|blur|chroma, asset, blur, edgeSoftness, chroma | Ganti latar lewat segmentasi tubuh, atau chroma key untuk kain hijau. Satu per efek. |
particles | asset anchor position rate emitting lifetime speed direction spread gravity size color | Pemancar partikel; semburan dari pemicu atau script. |
text | text anchor position fontSize color strokeColor align font bold | Teks di layar atau menempel ke wajah. Tidak pernah dicerminkan. |
sound | asset volume loop autoplay | Suara; butuh sentuhan pengguna sebelum bisa diputar. |
sprite | asset position size rotation opacity | Gambar di layar; juga templat untuk sprite yang dibuat script (visible: false). |
ui | widget score|timer|label, position label value fontSize color background align | Skor, timer (m:ss), atau label untuk game. |
Aksi setProperty dan script hanya boleh mengubah properti berikut (plus visible di semua node).
| kind | Properti |
|---|---|
faceSticker2D | opacity, scale, rotation |
model3D, faceMesh3D | scale |
lut | intensity |
colorAdjust | brightness, contrast, saturation, warmth, grain, vignette |
background | mode, blur, edgeSoftness |
particles | rate, emitting, color, speed, direction |
text | text, color, fontSize |
sound | volume |
sprite | opacity, rotation, x, y |
ui | value, label, color |
Pemicu menjalankan aksi tanpa kode. Sinyal kontinu memakai histeresis: menyala di ambang atas, mati di ambang bawah, dan harus bertahan sebentar, jadi tidak berkedip di dekat ambang. cooldownMs (bawaan 300) membatasi seberapa sering aksi berjalan; onEnd berjalan saat sinyal kontinu berakhir.
{
"id": "mouth",
"on": { "type": "mouthOpen" },
"cooldownMs": 300,
"actions": [{ "do": "setProperty", "node": "hearts", "property": "emitting", "value": true }],
"onEnd": [{ "do": "setProperty", "node": "hearts", "property": "emitting", "value": false }]
}| on.type | Opsi · ambang | Kapan |
|---|---|---|
start | — | Sekali saat efek mulai. |
tap | — | Ketukan di layar. |
timer | afterMs ≥ 16, repeat | Setelah jeda; timer berulang melewati ketukan yang terlewat. |
mouthOpen | jawOpen 0.35 / 0.20 | Mulut terbuka. |
blink | eye left|right|both | Kedip (0.5 / 0.3). |
smile | 0.55 / 0.35 | Senyum (rata-rata kiri dan kanan). |
eyebrowRaise | 0.55 / 0.30 | Alis terangkat. |
headTilt | direction left|right · 15° / 9° | Kepala miring ke bahu kiri atau kanan orang itu. |
headNod | ≥ 10°, ≤ 0.9 s | Mengangguk lalu kembali. |
handOpen · fist · pinch | hand left|right|any · 0.8 / 0.6 | Tangan terbuka, mengepal, atau mencubit (jempol–telunjuk). |
Aksi: show hide toggle playSound stopSound emit setProperty. Di Studio, tombol simulasi (buka mulut, kedip, senyum, miring, tangan, ketuk) memicu efekmu tanpa harus bergerak di depan kamera.
script.js adalah JavaScript biasa (tanpa import/export) yang berjalan di Web Worker terisolasi. Definisikan fungsi-fungsi ini di tingkat atas. Editor Studio memuat effect-api.d.ts, jadi kamu mendapat pelengkapan otomatis dan pemeriksaan tipe lewat JSDoc.
/** @type {MakeEffect.OnStart} */
function onStart(api) {}
/** @type {MakeEffect.OnFrame} */
function onFrame(dt, state, api) {}
/** @type {MakeEffect.OnSignal} */
function onSignal(type, phase, api) {}
function onTap(x, y, api) {}
function onStop(api) {}let score = 0;
/** @type {MakeEffect.OnStart} */
function onStart(api) {
api.setUi("score", 0, "Skor");
}
/** @type {MakeEffect.OnFrame} */
function onFrame(dt, state, api) {
if (!state.face) return;
for (const s of state.signals) {
if (s.type === "mouthOpen" && s.phase === "start") {
score += 1;
api.setUi("score", score);
api.emit("hearts", 15, state.face.points.mouthCenter[0], state.face.points.mouthCenter[1]);
}
}
if (state.time > 30) api.endGame(score);
}| Fungsi | Kapan |
|---|---|
onStart(api) | Sekali, setelah efek dimuat. |
onFrame(dt, state, api) | Setiap frame yang dijadwalkan untuk script. |
onSignal(type, phase, api) | Sinyal mulai/berakhir: "mouthOpen", "blink:left", "headTilt:right", "trigger:<id>", … |
onTap(x, y, api) | Ketukan di layar, koordinat 0..1. |
onStop(api) | Saat efek ditutup. |
| Field | Arti |
|---|---|
time, frame | Detik sejak mulai, penghitung frame. |
screen | { width, height, aspect } dalam px output. |
face | null bila tidak ada wajah; selain itu { x, y, width, roll, yaw, pitch, mouthOpen, blendshapes, points }. |
face.points | noseTip mouthCenter upperLip lowerLip leftEye rightEye forehead headTop chin leftEar rightEar sebagai [x, y]. |
face.blendshapes | jawOpen, mouthSmileLeft/Right, mouthPucker, cheekPuff, eyeBlinkLeft/Right, browInnerUp, … (0..1). |
hands | [{ side, x, y, openness, pinch, indexTip, thumbTip }]. |
signals, taps | Perubahan sinyal dan ketukan sejak frame script sebelumnya. |
face.roll > 0 berarti kepala miring ke kiri orang itu (kiri layar pada tampilan cermin). Untuk mengukur jarak, kalikan x dengan screen.aspect.
| Metode | Fungsi |
|---|---|
createSprite({ template | asset, x, y, w, h, rotation, opacity, z }) | Membuat sprite; mengembalikan id, atau null di batas sprite. |
setSprite(id, props) · removeSprite(id) | Mengubah atau menghapus sprite. |
setText(node, text) · setUi(node, value?, label?) | Teks, skor, timer (detik), atau label. |
setVisible(node, bool) · setProperty(node, prop, value) | Hanya properti yang boleh diubah (tabel di atas). |
playSound(node) · stopSound(node) · emit(node, count, x?, y?) | Suara dan semburan partikel. |
endGame(score) | Mengirim skor ke aplikasi; script berhenti menerima frame. |
log(...args) | Keluaran debug di konsol Studio (≤ 20 baris/detik). |
random() · randomRange · randomInt · setSeed | Acak deterministik; Math.random memakai generator yang sama. |
overlaps(a, b) · distance · clamp | Bantuan tabrakan dan jarak. |
| Batas | Nilai | Keterangan |
|---|---|---|
.mfx | 12 MB | Ukuran paket. |
unpacked | 24 MB · 200 files | Isi paket setelah dibuka. |
image | 2048×2048 · 4 MB | Per gambar. |
script.js | 256 KB | Ukuran script. |
limits.scriptBudgetMs | 4 ms (maks 8) | Rata-rata waktu script per frame. |
limits.maxSprites | 100 (maks 300) | Sprite hidup dari script. |
limits.maxParticles | 1000 (maks 2000) | Semua pemancar. |
limits.maxDurationSec | 600 (maks 1800) | Lama sesi sebelum script dihentikan. |
Waktu script dirata-rata per 30 frame. Jendela di atas anggaran, atau satu frame di atas 10× anggaran, dihitung sebagai pelanggaran; jendela yang bersih menghapus satu. Pada 3 pelanggaran script dihentikan dan efek dimatikan. Script yang tidak menjawab dalam 250 ms (1 detik saat memuat dan onStart) langsung dihentikan.
Per frame: kamera → tracker MediaPipe yang dideklarasikan efek (wajah dengan blendshape, tangan, segmentasi) → sinyal dan pemicu → pass warna dan latar → lapisan 3D → lapisan 2D → frame script. Tracker hanya diunduh bila efek memakainya, dari server Make sendiri (tanpa CDN).
Kualitas otomatis mulai di level 1 dan mengukur fps. Di bawah 85% dari target 30 fps selama 2 detik, level turun; di atas 97% selama 6 detik, level naik.
| Level | Skala render | Tracker tiap N frame | Segmentasi tiap N tracker |
|---|---|---|---|
0 | 1.0 | 1 | 1 |
1 | 0.85 | 1 | 2 |
2 | 0.75 | 2 | 2 |
3 | 0.6 | 2 | 3 |
4 | 0.5 | 3 | 3 |
| Cek | Gagal bila |
|---|---|
archive | Zip valid, nama file aman, ≤ 200 file, ≤ 24 MB isi, ≤ 12 MB paket. |
manifest | Semua aturan effect.json, dengan path yang tepat. |
assets | File ada dan terdaftar, isi cocok dengan ekstensi, batas ukuran, LUT terbaca. |
script | API terlarang dan kesalahan sintaks, dengan nomor baris. |
size | Peringatan di atas 8 MB, di atas 16 megapiksel gambar, atau ketiga tracker sekaligus. |
sandbox | Uji jalan tanpa layar: onStart lalu 90 frame wajah, tangan, dan ketukan sintetis dalam batas CPU dan memori. |
| Status | Arti |
|---|---|
draft | Belum diajukan, atau ditarik kembali. |
in_review | Sebuah versi sedang ditinjau tim Make. |
published | Ada versi yang disetujui; itulah yang dimuat kamera. |
rejected | Keputusan terakhir adalah penolakan; perbaiki lalu ajukan versi baru. |
removed | Diturunkan oleh Make. Video yang sudah ada tetap bisa diputar. |
Sebelum disetujui pertama kali, nama, deskripsi, kategori, dan ikon proyek mengikuti unggahan terbaru. Setelah terbit, semua perubahan publik lewat versi baru yang ditinjau.
Kamu membaca dan menyetujui ketentuan lengkap sendiri di Studio sebelum membuat efek pertama, dan lagi setiap kali ketentuannya diperbarui.
Efek yang kamu buat tetap milikmu. Dengan mengajukannya, kamu memberi Make izin untuk menyimpan, meninjau, menampilkan, dan menjalankan efek itu di Make (web dan aplikasi) selama efek itu terbit.
Gambar, model 3D, LUT, suara, dan kode di dalam efek harus buatanmu sendiri atau kamu punya izin untuk memakainya. Jangan memakai logo, merek, karakter, atau musik milik orang lain tanpa izin.
Tidak boleh: pornografi atau ketelanjangan, kekerasan sadis, ujaran kebencian, perundungan, penipuan, informasi palsu yang berbahaya, atau efek yang mengejek ciri fisik, ras, agama, atau disabilitas seseorang.
Efek berjalan di perangkat pengguna. Gambar kamera tidak pernah keluar dari perangkat, dan script efek tidak punya akses ke jaringan, penyimpanan, atau data pengguna.
Setiap versi diperiksa otomatis lalu ditinjau tim Make sebelum orang lain bisa memakainya. Make boleh menolak versi dengan alasan yang dijelaskan kepadamu.
Kamu mendapat statistik pemakaian, lencana, dan rekap bulanan per efek. Rekap itu adalah data, bukan janji pembayaran. Program hadiah, bila ada, diumumkan terpisah dengan syaratnya sendiri.
Bila ketentuan ini berubah, kamu diminta menyetujui versi barunya di Studio sebelum membuat atau mengajukan efek lagi. Efek yang sudah terbit tetap tampil.
Masuk dengan akun Make di browser komputer, setujui ketentuan developer, lalu pilih template.