Skip to content

Make Effect Studio

Buat efek kamera untuk Makeplay.

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.

Telinga kucing
Kacamata
Ganti latar
Filter film hangat
Tangkap dengan mulut
Miringkan kepala

Yang bisa kamu buat

Satu runtime WebGL + MediaPipe menjalankan efek di browser dan di aplikasi. Semua pemrosesan terjadi di perangkat; gambar kamera tidak pernah dikirim ke server.

Stiker wajah

Telinga, kacamata, topi, atau masker 2D yang menempel ke 478 titik wajah dan ikut miring serta menoleh.

Objek 3D

Model GLB di kepala atau masker 3D di ruang wajah, dengan penghalang kepala supaya terlihat nyata.

Filter warna

LUT 3D (.cube atau PNG), kecerahan, kontras, kehangatan, grain, dan vignette.

Ganti latar

Segmentasi tubuh di perangkat untuk latar foto, video, atau blur, plus chroma key untuk kain hijau.

Partikel, teks, dan suara

Hati yang keluar saat membuka mulut, kilau saat senyum, cap tanggal, efek suara.

Game kecil

JavaScript di sandbox: sprite, skor, timer, tabrakan, dan endGame. Dikendalikan dengan mulut, kepala, atau tangan.

Mulai dari template

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.

Telinga kucing

Stiker wajah di kepala dan hidung. Buka mulut untuk mengeluarkan hati.

faceSticker2D · particles · mouthOpen

Kacamata

Kacamata yang ikut miring dan menoleh. Senyum untuk kilau dan suara.

faceSticker2D · smile · sound

Ganti latar

Latar diganti foto pantai lewat segmentasi. Ketuk untuk latar blur.

background · segmentation · script

Filter film hangat

LUT warna, grain, vignette, dan cap tanggal.

lut · colorAdjust · text

Tangkap dengan mulut

Game: buah jatuh, buka mulut di dekatnya untuk menangkap. 30 detik.

sprite · ui · script · endGame

Miringkan kepala

Game: miringkan kepala untuk menggerakkan burung dan menghindari batu.

sprite · headTilt · script

Dari ide sampai terbit

  1. Validasi langsung

    Studio menjalankan validator yang sama dengan server setiap kali kamu mengubah sesuatu. Klik masalahnya untuk melompat ke node, properti, aset, atau baris script.

  2. Unggah versi

    Draf dikemas jadi .mfx lalu diunggah. Nomor versi yang sama mengganti draf; versi baru harus lebih tinggi dari versi yang terakhir diajukan.

  3. Periksa dan uji di HP

    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.

  4. Ajukan untuk ditinjau

    Satu versi per efek bisa ditinjau sekaligus. Kamu bisa menariknya kembali selama belum diputuskan. Penolakan selalu disertai alasan.

  5. Terbit

    Setelah disetujui, efek muncul di katalog dan kamera Makeplay. Video yang dibuat dengannya menampilkan nama efek dan akunmu.

Format paket

Efek 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": []
}

Koordinat dan satuan

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.

RuangArti
x, yLayar 0..1 dari kiri atas output.
vhUkuran sebagai pecahan tinggi layar, jadi persegi tetap persegi di rasio apa pun.
face unitsGeser dan lebar stiker dalam lebar wajah (telinga ke telinga).
3DSentimeter di ruang kepala: x ke kanan, y ke atas, z ke arah kamera.
anglesDerajat; di layar, positif = searah jarum jam.
colors#rrggbb atau #rrggbbaa.

effect.json

FieldNilaiAturan
format1Versi format, selalu 1.
ida-z 0-9 . _ -3–64 karakter, diawali huruf atau angka. Studio mengisinya dari slug proyek.
name1–60Nama efek yang dilihat pengguna.
version1.2.3MAJOR.MINOR.PATCH. Versi baru harus lebih tinggi dari versi yang terakhir diajukan.
description / hint≤ 500 / ≤ 80Deskripsi di katalog; petunjuk singkat saat efek dibuka.
iconasset idAset gambar persegi (256 px disarankan).
categoryface beauty filter background game fun text otherKategori di katalog.
trackersface hands segmentationWajib memuat semua tracker yang dibutuhkan node dan pemicu. Tracker yang tidak dipakai jadi peringatan karena memperlambat.
maxFaces / maxHands1–2Jumlah wajah atau tangan yang dilacak (bawaan 1).
assets / nodes / triggers≤ 120 / ≤ 128 / ≤ 64Pohon node maksimal 6 tingkat.
script / limitsscript.jsPath script di paket dan batas performa (lihat Batas).

Aset

ID aset diawali huruf (A-Z a-z 0-9 _ -, maks. 64). Path relatif dengan garis miring biasa, tanpa ..

JenisFile · batasPemeriksaan
imagepng webp jpg · 4 MBMaksimal 2048×2048 px; header harus cocok dengan ekstensi.
modelglb · 8 MBglTF biner. Satuan dalam cm.
lutcube png · 2 MB.cube 3D (ukuran 2–65) atau PNG 512×512: 8×8 petak 64×64, biru memilih petak, merah = x, hijau = y.
audiomp3 m4a ogg wav · 4 MBIsi file harus cocok dengan ekstensinya.
videomp4 webm · 10 MBUntuk latar video.

Node

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.

Titik jangkar

JangkarTitik
noseTip betweenEyes forehead headTop chin faceCenterGaris tengah wajah (headTop diperkirakan di atas dahi).
leftEye rightEye leftEyebrow rightEyebrow leftCheek rightCheek leftEar rightEarSisi kiri/kanan orang itu sendiri.
upperLip lowerLip mouthCenter mouthLeft mouthRightMulut.
landmark:<0-477>Indeks mentah face mesh MediaPipe.
hand:wrist hand:palm hand:thumbTip hand:indexTip hand:middleTipTangan pertama yang terdeteksi (butuh tracker hands).
screenPosisi layar (position).

Jenis node

kindFieldKegunaan
faceSticker2Dasset anchor offset scale rotation followRotation followYaw opacity faceGambar yang menempel ke titik wajah atau tangan, ikut miring dan menoleh.
model3Dasset anchor offset[cm] rotation scale faceModel GLB pada pose kepala.
faceMesh3Dasset occluder scale faceGLB di ruang wajah kanonik MediaPipe (masker), dengan penghalang kepala.
lutasset intensityFilter warna LUT 3D. Satu per efek.
colorAdjustbrightness contrast saturation warmth grain vignetteAtur warna -1..1, grain dan vignette 0..1. Satu per efek.
backgroundmode image|video|blur|chroma, asset, blur, edgeSoftness, chromaGanti latar lewat segmentasi tubuh, atau chroma key untuk kain hijau. Satu per efek.
particlesasset anchor position rate emitting lifetime speed direction spread gravity size colorPemancar partikel; semburan dari pemicu atau script.
texttext anchor position fontSize color strokeColor align font boldTeks di layar atau menempel ke wajah. Tidak pernah dicerminkan.
soundasset volume loop autoplaySuara; butuh sentuhan pengguna sebelum bisa diputar.
spriteasset position size rotation opacityGambar di layar; juga templat untuk sprite yang dibuat script (visible: false).
uiwidget score|timer|label, position label value fontSize color background alignSkor, timer (m:ss), atau label untuk game.

Properti yang bisa diubah

Aksi setProperty dan script hanya boleh mengubah properti berikut (plus visible di semua node).

kindProperti
faceSticker2Dopacity, scale, rotation
model3D, faceMesh3Dscale
lutintensity
colorAdjustbrightness, contrast, saturation, warmth, grain, vignette
backgroundmode, blur, edgeSoftness
particlesrate, emitting, color, speed, direction
texttext, color, fontSize
soundvolume
spriteopacity, rotation, x, y
uivalue, label, color

Pemicu

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.typeOpsi · ambangKapan
start—Sekali saat efek mulai.
tap—Ketukan di layar.
timerafterMs ≥ 16, repeatSetelah jeda; timer berulang melewati ketukan yang terlewat.
mouthOpenjawOpen 0.35 / 0.20Mulut terbuka.
blinkeye left|right|bothKedip (0.5 / 0.3).
smile0.55 / 0.35Senyum (rata-rata kiri dan kanan).
eyebrowRaise0.55 / 0.30Alis terangkat.
headTiltdirection left|right · 15° / 9°Kepala miring ke bahu kiri atau kanan orang itu.
headNod≥ 10°, ≤ 0.9 sMengangguk lalu kembali.
handOpen · fist · pinchhand left|right|any · 0.8 / 0.6Tangan 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 API

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);
}
FungsiKapan
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.

state

FieldArti
time, frameDetik sejak mulai, penghitung frame.
screen{ width, height, aspect } dalam px output.
facenull bila tidak ada wajah; selain itu { x, y, width, roll, yaw, pitch, mouthOpen, blendshapes, points }.
face.pointsnoseTip mouthCenter upperLip lowerLip leftEye rightEye forehead headTop chin leftEar rightEar sebagai [x, y].
face.blendshapesjawOpen, mouthSmileLeft/Right, mouthPucker, cheekPuff, eyeBlinkLeft/Right, browInnerUp, … (0..1).
hands[{ side, x, y, openness, pinch, indexTip, thumbTip }].
signals, tapsPerubahan 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.

api

MetodeFungsi
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 · setSeedAcak deterministik; Math.random memakai generator yang sama.
overlaps(a, b) · distance · clampBantuan tabrakan dan jarak.

Sandbox

  • Script berjalan di Web Worker khusus tanpa DOM. fetch, XMLHttpRequest, WebSocket, importScripts, indexedDB, timer, eval, Function, WebAssembly, dan constructor fungsi dihapus sebelum script dijalankan.
  • Validator menolak script yang menyebut import, export, API jaringan, eval( atau Function( — lengkap dengan nomor barisnya — sebelum ditinjau.
  • Frame dikirim berurutan: script yang lambat kehilangan frame script, kamera tetap lancar.
  • Setiap perintah divalidasi (node ada, jenis benar, angka wajar, properti diizinkan). Perintah yang salah dibuang dan dilaporkan ke konsol.

Batas

BatasNilaiKeterangan
.mfx12 MBUkuran paket.
unpacked24 MB · 200 filesIsi paket setelah dibuka.
image2048×2048 · 4 MBPer gambar.
script.js256 KBUkuran script.
limits.scriptBudgetMs4 ms (maks 8)Rata-rata waktu script per frame.
limits.maxSprites100 (maks 300)Sprite hidup dari script.
limits.maxParticles1000 (maks 2000)Semua pemancar.
limits.maxDurationSec600 (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.

Runtime dan performa

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.

LevelSkala renderTracker tiap N frameSegmentasi tiap N tracker
01.011
10.8512
20.7522
30.623
40.533
  • Pakai hanya tracker yang dibutuhkan. Segmentasi dan tangan paling berat.
  • Kecilkan gambar: tekstur 512–1024 px biasanya cukup untuk stiker.
  • Buat sprite sekali lalu pakai ulang (setSprite) daripada membuat dan menghapus tiap frame.
  • Perhatikan fps, waktu tracker, dan waktu script di pratinjau Studio; uji juga di HP lewat QR.

Uji dan terbitkan

  • Validasi langsung. Studio menjalankan validator yang sama dengan server setiap kali kamu mengubah sesuatu. Klik masalahnya untuk melompat ke node, properti, aset, atau baris script.
  • Unggah versi. Draf dikemas jadi .mfx lalu diunggah. Nomor versi yang sama mengganti draf; versi baru harus lebih tinggi dari versi yang terakhir diajukan.
  • Periksa dan uji di HP. 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.
  • Ajukan untuk ditinjau. Satu versi per efek bisa ditinjau sekaligus. Kamu bisa menariknya kembali selama belum diputuskan. Penolakan selalu disertai alasan.
  • Terbit. Setelah disetujui, efek muncul di katalog dan kamera Makeplay. Video yang dibuat dengannya menampilkan nama efek dan akunmu.

Pemeriksaan otomatis

CekGagal bila
archiveZip valid, nama file aman, ≤ 200 file, ≤ 24 MB isi, ≤ 12 MB paket.
manifestSemua aturan effect.json, dengan path yang tepat.
assetsFile ada dan terdaftar, isi cocok dengan ekstensi, batas ukuran, LUT terbaca.
scriptAPI terlarang dan kesalahan sintaks, dengan nomor baris.
sizePeringatan di atas 8 MB, di atas 16 megapiksel gambar, atau ketiga tracker sekaligus.
sandboxUji jalan tanpa layar: onStart lalu 90 frame wajah, tangan, dan ketukan sintetis dalam batas CPU dan memori.

Status efek

StatusArti
draftBelum diajukan, atau ditarik kembali.
in_reviewSebuah versi sedang ditinjau tim Make.
publishedAda versi yang disetujui; itulah yang dimuat kamera.
rejectedKeputusan terakhir adalah penolakan; perbaiki lalu ajukan versi baru.
removedDiturunkan 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.

Program kreator

  • Statistik harian per efek: dipakai (kamera membuka efek), video yang diposting, dan tayangan video itu, untuk 7–90 hari.
  • Lencana: Kreator Efek (efek pertama terbit), Efek Trending (masuk 20 teratas), dan Pilihan Make.
  • Profil kreator efek publik dengan semua efekmu yang terbit dan jumlah pemakaiannya.
  • Rekap bulanan per efek (dipakai, video, tayangan, kreator yang dijangkau) sebagai data untuk program hadiah. Tidak ada pembayaran otomatis.

Ringkasan ketentuan developer

Kamu membaca dan menyetujui ketentuan lengkap sendiri di Studio sebelum membuat efek pertama, dan lagi setiap kali ketentuannya diperbarui.

Karyamu, izinmu

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.

Hanya isi yang boleh kamu pakai

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.

Isi yang tidak diizinkan

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.

Privasi dan keamanan

Efek berjalan di perangkat pengguna. Gambar kamera tidak pernah keluar dari perangkat, dan script efek tidak punya akses ke jaringan, penyimpanan, atau data pengguna.

Tinjauan dan penurunan

Setiap versi diperiksa otomatis lalu ditinjau tim Make sebelum orang lain bisa memakainya. Make boleh menolak versi dengan alasan yang dijelaskan kepadamu.

Statistik, lencana, dan insentif

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.

Perubahan ketentuan

Bila ketentuan ini berubah, kamu diminta menyetujui versi barunya di Studio sebelum membuat atau mengajukan efek lagi. Efek yang sudah terbit tetap tampil.

Siap membuat efek pertamamu?

Masuk dengan akun Make di browser komputer, setujui ketentuan developer, lalu pilih template.