個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證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