JSFiddle - React, Tailwind, and code Playground
by Matt
HTML
<base href="https://rawcdn.githack.com/mrdoob/three.js/r156/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/",
"lil-gui": "https://cdn.jsdelivr.net/npm/[email protected]/dist/lil-gui.esm.min.js"
}
}
</script>
CSS
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 { GUI } from 'lil-gui'
let scene, camera, renderer
let orbitControls, clock
let params
class SkeletonAxesHelper extends THREE.Object3D {
constructor(object, size = 0.05) {
super()
this.bones = []
this.axesHelpers = []
object.traverse((object) => object.isBone && this.bones.push(object))
for (let i = 0; i < this.bones.length; i++) {
const axesHelper = new THREE.AxesHelper(size)
axesHelper.material.transparent = true
axesHelper.material.depthTest = false
axesHelper.matrixAutoUpdate = false
this.axesHelpers.push(axesHelper)
this.add(axesHelper)
}
}
updateMatrixWorld(force) {
for (let i = 0; i < this.bones.length; i++) {
const bone = this.bones[i]
const axesHelper = this.axesHelpers[i]
axesHelper.matrix.copy(bone.matrixWorld)
}
super.updateMatrixWorld(force)
}
dispose() {
for (let i = 0; i < this.axesHelpers.length; i++) {
this.axesHelpers[i].dispose()
}
}
}
init().then(animate)
async function init() {
params = {
}
scene = new THREE.Scene()
camera = new THREE.PerspectiveCamera(75, undefined, 0.1, 1000)
camera.position.set(1, 2, 3)
clock = new THREE.Clock()
renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.toneMapping = THREE.ACESFilmicToneMapping
document.body.appendChild(renderer.domElement)
orbitControls = new OrbitControls(camera, renderer.domElement)
const rgbeLoader = new RGBELoader()
const gltfLoader = new GLTFLoader()
const [ hdri, gltf ] = await Promise.all([
rgbeLoader.loadAsync('textures/equirectangular/venice_sunset_1k.hdr'),
gltfLoader.loadAsync('models/gltf/Xbot.glb'),
])
hdri.mapping = THREE.EquirectangularReflectionMapping
scene.background = hdri
scene.environment =...