JSFiddle - React, Tailwind, and code Playground
by Matt
HTML
<base href="https://rawcdn.githack.com/mrdoob/three.js/r154/examples/" />
<script async src="https://cdn.jsdelivr.net/npm/[email protected]/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"three": "https://cdn.jsdelivr.net/npm/[email protected]/build/three.module.js",
"three/addons/": "https://cdn.jsdelivr.net/npm/[email protected]/examples/jsm/",
"@pixiv/three-vrm": "https://cdn.jsdelivr.net/npm/@pixiv/[email protected]/lib/three-vrm.module.min.js"
}
}
</script>
CSS
body {
background-color: black;
}
canvas {
position: fixed;
inset: 0;
}
JavaScript
import * as THREE from 'three'
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'
import { RGBELoader } from 'three/addons/loaders/RGBELoader.js'
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'
import { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';
import { VRMLoaderPlugin, VRMUtils } from '@pixiv/three-vrm';
const VRM_URL = "https://hallway-public.nyc3.cdn.digitaloceanspaces.com/streamer/avatar/hallway/MIMIC/Maya_meshopt-high-webp_gzip.vrm"
let scene, camera, renderer
let orbitControls, clock
let currentVrm
init().then(animate)
async function init() {
scene = new THREE.Scene()
camera = new THREE.PerspectiveCamera(75, undefined, 0.1, 1000)
camera.position.set(-0.2, 1.5, 1)
clock = new THREE.Clock()
renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
renderer.toneMapping = THREE.ACESFilmicToneMapping
renderer.outputColorSpace = THREE.SRGBColorSpace
document.body.appendChild(renderer.domElement)
orbitControls = new OrbitControls(camera, renderer.domElement)
orbitControls.target.set(0, 1, 0)
const ambientLight = new THREE.AmbientLight()
scene.add(ambientLight)
const directionalLight = new THREE.DirectionalLight()
scene.add(directionalLight)
const gltfLoader = new GLTFLoader()
gltfLoader.setMeshoptDecoder( MeshoptDecoder );
gltfLoader.register( ( parser ) => {
return new VRMLoaderPlugin( parser );
} );
const gltf = await gltfLoader.loadAsync(VRM_URL)
currentVrm = gltf.userData.vrm
// Visualize normalized bones
for (const bone of Object.values(currentVrm.humanoid.normalizedHumanBones)) {
const axes = new THREE.AxesHelper(0.1)
axes.material.depthTest = false
axes.material.transparent = true
bone.node.add(axes)
}
scene.add(gltf.scene)
onWindowResize()
window.addEventListener('resize', onWindowResize, false)
}
function animate() {
const dt = clock.getDelta()
orbitControls.update()
if (currentVrm)...