motion / examples /playground.html
harshthedev's picture
SuperHQ Motion experiment: locomotion and action checkpoints, runtime, clips, evaluation
6adbbb1 verified
Raw History Blame Contribute Delete
5.12 kB
<!doctype html>
<html lang="en"><head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="motion-model" content="../model/">
<meta name="motion-actions" content="../actions/">
<meta name="motion-clips" content="../clips/action-clips.json">
<meta name="motion-character" content="./assets/characters/eric-renderpeople.glb">
<title>SuperHQ Motion Experiment</title><link rel="icon" href="data:,">
</head><body>
<main id="viewport" aria-label="Interactive motion playground" tabindex="0">
<div class="tools"><div class="connection"><i id="lamp"></i><span id="connection" role="status">Loading model</span></div>
<details id="help"><summary aria-label="Help and settings" title="Help and settings">?</summary><div class="help-panel">
<h2>Controls</h2>
<dl><dt>Move</dt><dd><kbd>W</kbd><kbd>A</kbd><kbd>S</kbd><kbd>D</kbd></dd><dt>Jog</dt><dd><kbd>Shift</kbd></dd><dt>Sprint</dt><dd><kbd>Ctrl</kbd> + <kbd>Shift</kbd></dd><dt>Jump</dt><dd><kbd>Space</kbd></dd><dt>Crouch</dt><dd><kbd>C</kbd></dd><dt>Look</dt><dd>Drag · <button id="capture" title="Lock mouse look. Escape releases the cursor.">Lock cursor</button></dd><dt>Dash / lunge</dt><dd><kbd>F</kbd> / <kbd>G</kbd></dd><dt>Knockback test</dt><dd><kbd>H</kbd></dd><dt>Zoom</dt><dd>Scroll</dd><dt>Shoulder view</dt><dd>Hold right mouse</dd><dt>Pause / reset</dt><dd><kbd>P</kbd> / <kbd>R</kbd></dd></dl>
<div class="help-footer"><label title="Display model only; motion is identical">Character <select id="character"><option value="eric">Eric</option><option value="mannequin">Mannequin</option></select></label><a id="credit" href="https://sketchfab.com/3d-models/eric-rigged-001-rigged-3d-business-man-a46bc9f67aaa415bb4f3241eef900e7f" target="_blank" rel="noopener" title="Eric Rigged 001 by Renderpeople, CC BY 4.0">Eric © Renderpeople, CC BY 4.0 ↗</a><label title="Display-only vertical correction, bounded to 5 cm"><input id="guard" type="checkbox" checked> Floor guard</label><a id="comparison" href="https://huggingface.co/spaces/superhq-ai/motion/blob/main/PLAYGROUND.md" target="_blank" rel="noopener">Experiment notes ↗</a></div>
</div></details></div>
<div id="reticle" aria-hidden="true">+</div>
<div id="scene-error" role="alert" hidden></div>
<div class="motion-state"><strong id="state">Standing idle</strong><span id="route">Ready when you are</span></div>
<div class="telemetry"><span id="speed">0.00</span> m/s <span class="separator">·</span> <span id="latency">0.0</span> ms / inference</div>
<nav class="toolbar" aria-label="Motion controls">
<select id="style" aria-label="Motion style"><option value="natural">Natural</option><option value="carry">Carrying</option><option value="zombie">Zombie</option></select><span class="divider"></span>
<button id="crouch" aria-pressed="false" title="Toggle crouch (C)"><span id="crouch-label">Crouch</span> <kbd>C</kbd></button>
<button id="jump" title="Jump (Space)">Jump <kbd>Space</kbd></button>
<button id="demo" title="Repeat walk and crouch transitions">Walk ↔ crouch <span>▶</span></button><span class="divider"></span>
<button id="pause" aria-label="Pause" title="Pause (P)">Ⅱ</button><button id="reset" aria-label="Reset" title="Reset (R)">↺</button>
</nav>
<p id="demo-note" role="status"></p>
</main>
<script type="module">
const signature=location.hostname.endsWith('.static.hf.space')?new URL(location.href).searchParams.get('__sign'):null;
function asset(path){const url=new URL(path,document.baseURI);if(signature&&url.origin===location.origin)url.searchParams.set('__sign',signature);return url.href;}
const css=document.createElement('link');css.rel='stylesheet';css.href=asset('./playground.css');document.head.append(css);
const imports={three:asset('./vendor/three.module.js')};
for(const path of ['./playground.js','./playground-driver.js','../src/game-controller.js','../src/game-driver.js','../src/action-controller.js','../src/action-stabilizer.js','../src/movement-network.js','../src/pose.js','../src/profile-controller.js','../src/profile-clock.js','../src/controller.js','../src/network.js','../src/ground-pose.js','../src/stride-jump.js','../src/leg-ik.js','../src/clip-actions.js','../src/adapters/three.js','./vendor/jsm/loaders/GLTFLoader.js','./vendor/jsm/utils/BufferGeometryUtils.js','./vendor/three.module.js','./vendor/three.core.js'])imports[new URL(path,document.baseURI).href]=asset(path);
const map=document.createElement('script');map.type='importmap';map.textContent=JSON.stringify({imports});document.head.append(map);
function failed(error){document.getElementById('connection').textContent='Could not start';document.getElementById('lamp').className='failed';const box=document.getElementById('scene-error');box.hidden=false;box.textContent=String(error?.message||error).replace(/([?&]__sign=)[^\s"']+/g,'$1[redacted]');}
const deadline=setTimeout(()=>failed('Loading is taking too long. Reload or check your connection.'),30000);
import(asset('./playground.js')).catch(failed).finally(()=>clearTimeout(deadline));
</script></body></html>