Doop
Doop: 오픈소스 멀티플레이어 디자인 캔버스 및 AI 에이전트용 MCP
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Character animation for the web: emotions, gestures and elemental GLSL shaders. Canvas 2D and WebGL 2. MIT.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Character animation for the web: emotions, gestures and elemental GLSL shaders. Canvas 2D and WebGL 2. MIT.
Real-time character animation engine with Canvas 2D and WebGL 3D rendering. 8 elemental shader systems. 160 elemental gestures. One replicable pattern.
Live · emotiveengine.com · Demo · elemental gestures · npm · @joshtol/emotive-engine · Status · active
npm install @joshtol/emotive-engine
import { EmotiveMascot3D } from '@joshtol/emotive-engine/3d';
const mascot = new EmotiveMascot3D({
coreGeometry: 'crystal',
assetBasePath: '/assets', // self-hosted assets (see below)
});
mascot.init(document.getElementById('container'));
mascot.start();
mascot.setEmotion('joy');
mascot.express('bounce');
mascot.morphTo('heart');
mascot.feel('happy, bouncing'); // Natural language control
3D mode requires Three.js (npm install three, version 0.170 or later) and a
browser with WebGL 2. Without WebGL 2, init() logs a warning and renders
nothing; it does not fall back to Canvas 2D, which is the separate
@joshtol/emotive-engine import below.
import { EmotiveMascot } from '@joshtol/emotive-engine';
const mascot = new EmotiveMascot();
await mascot.init(document.getElementById('container'));
mascot.start();
mascot.feel('happy, bouncing');
2D mode has no dependencies and requires no external assets. Both modes need
Node 20 or later to build (engines).
Every build is a separate entry, so a page that shows one elemental does not pay
for the other seven. Sizes are brotli over the wire (npm run size:report);
Three.js is a peer dependency and is not included in the 3D numbers.
| Import | Brotli | What you get |
|---|---|---|
@joshtol/emotive-engine | 178 KB | 2D canvas engine |
@joshtol/emotive-engine/lean | 166 KB | 2D, no rhythm sync / accessibility / profiling |
@joshtol/emotive-engine/minimal | 67 KB | 2D loading-screen build |
@joshtol/emotive-engine/3d | 232 KB | 3D, no elementals |
@joshtol/emotive-engine/3d-<element> | 249 to 256 KB | 3D + one elemental (see below) |
@joshtol/emotive-engine/3d-elementals | 303 KB | 3D + all eight elementals |
The eight single-element entries are 3d-fire, 3d-water, 3d-ice,
3d-electric, 3d-earth, 3d-nature, 3d-light and 3d-void. Each registers
only its own element and gestures; the other elements' shaders and gestures are
not in the file.
// A page that only shows the electric elemental
import { EmotiveMascot3D } from '@joshtol/emotive-engine/3d-electric';
const mascot = new EmotiveMascot3D({
coreGeometry: 'crystal',
assetBasePath: '/assets',
maxPixelRatio: 1.5, // cap the DPR (default 2.0): sharpness vs fill rate
hdri: false, // skip the optional 1.7 MB studio HDRI
glowHalo: false, // no screen-space halo when the canvas bleeds past its slot
surface: 'light', // or mascot.setSurface('light'): arcs drawn as ink on light pages
});
mascot.init(document.getElementById('container'));
mascot.start();
mascot.express('shock'); // any electric gesture; fire gestures etc. are not registered
A gesture from an element that is not in the entry is simply unknown to
express(). Import 3d-elementals when a page switches between elements.
Shared: 15 emotions · 179 gestures · Natural language feel() API ·
TypeScript definitions · Unified API
The npm package ships JavaScript only. GLB models, textures, and HDRI maps
must be self-hosted. They live in assets/ in this repository. The 3D engine
loads WebP textures (Crystal 282 KB, Moon 1.2 MB, Sun 0.8 MB); the PNG/JPEG
sources sit beside them and are not requested at runtime.
new EmotiveMascot3D({
assetBasePath: '/assets', // wherever you host the assets folder
});
| Hosting option | assetBasePath |
|---|---|
Copy to public/ | '/assets' |
| CDN / S3 | 'https://cdn.example.com/emotive-engine/assets' |
| GitHub Pages | 'https://joshtol.github.io/emotive-engine/assets' |
<assetBasePath>/
├── models/Elements/ # GLB models for elemental effects
├── textures/ # Crystal, Moon, Sun textures
└── hdri/ # Environment maps (optional)
<!-- 2D (UMD, no dependencies) -->
<script src="https://unpkg.com/@joshtol/emotive-engine/dist/emotive-mascot.umd.js"></script>
<!-- 3D (ESM, requires Three.js import map) -->
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/[email protected]/build/three.module.min.js"
}
}
</script>
<script type="module">
import { EmotiveMascot3D } from 'https://unpkg.com/@joshtol/emotive-engine/dist/emotive-mascot-3d.js';
</script>
| Doc | Description |
|---|---|
| API Reference | All methods, configuration options, emotions, gestures, geometries |
| LLM Integration | Natural language feel() API, system prompt examples |
| Gestures | Full gesture catalog (179 base + 160 elemental) |
| Quick Reference | Cheat sheet for emotions, undertones, and common patterns |
| Architecture | Internal design and rendering pipeline |
git clone https://github.com/joshtol/emotive-engine.git
cd emotive-engine
npm install && npm run build && npm run local
# → http://localhost:3000
MIT (SPDX MIT), © 2025-2026 Joshua Tollette. See LICENSE.md.
Created by Joshua Tollette