Spaces:
Runtime error
Runtime error
| import React, { Suspense } from 'react' | |
| import { Canvas, useFrame } from '@react-three/fiber' | |
| import { OrbitControls, Stage, useFBX, PerspectiveCamera, useGLTF } from '@react-three/drei'; | |
| import { MeshStandardMaterial } from 'three/src/materials/MeshStandardMaterial'; | |
| // import * as THREE from 'three'; | |
| import _ from 'lodash'; | |
| import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; | |
| import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader"; | |
| import { useLoader } from '@react-three/fiber'; | |
| import { sRGBEncoding, LinearEncoding } from 'three/src/constants'; | |
| function Avatar({ fbx_url }) { | |
| let fbx = useGLTF(fbx_url); | |
| // console.log(fbx.scene); | |
| // let fbx = useLoader(GLTFLoader, fbx_url, loader => { | |
| // const dracoLoader = new DRACOLoader(); | |
| // dracoLoader.setDecoderPath('/draco-gltf/'); | |
| // loader.setDRACOLoader(dracoLoader); | |
| // }); | |
| fbx.scene.traverse(node => { | |
| if(node.type === 'Mesh' || node.type == 'SkinnedMesh') { | |
| node.frustumCulled = false; | |
| // let prevMaterial = node.material; | |
| // node.material = new MeshStandardMaterial(); | |
| // node.material.copy(prevMaterial); | |
| // node.material.roughness = 0.9; | |
| // node.material.color.setHex(0xFFFFFF); | |
| // node.material.environmentIntensity = 0.2; | |
| // node.material.envMapIntensity = 0.2; | |
| if (node.name.toLowerCase().includes("hair")) { | |
| node.material.transparent = true; | |
| node.material.depthWrite = false; | |
| node.material.side = 2; | |
| node.material.color.setHex(0x222222); | |
| } | |
| } | |
| }); | |
| // let posesFbx = useFBX("/avatar.fbx"); | |
| // const clips = posesFbx.animations; | |
| // const mixer = new THREE.AnimationMixer(fbx); | |
| // setTimeout(() => { | |
| // // mixer.clipAction(clips[2]).play(); | |
| // }, 2000); | |
| // useFrame((state, delta) => { | |
| // mixer.update(delta); | |
| // }); | |
| // console.log("FBX to render", fbx); | |
| return (<group> | |
| <primitive object={fbx.scene} dispose={null} /> | |
| </group>); | |
| } | |
| function App() { | |
| let avatarUrl = (new URLSearchParams(window.location.search)).get("avatar"); | |
| return ( | |
| <div className="full"> | |
| <Canvas dpr={2}> | |
| <PerspectiveCamera | |
| position={[0, 1.6, 2.5]} | |
| makeDefault={true}/> | |
| <OrbitControls | |
| target={[0, 1, 0]} | |
| /> | |
| <Suspense fallback={null}> | |
| <Stage | |
| contactShadow | |
| shadows | |
| adjustCamera={false} | |
| intensity={0.2} | |
| environment="forest" | |
| preset="upfront"> | |
| {/* <Avatar fbx_url={"/avatar.fbx"} /> */} | |
| <Avatar fbx_url={avatarUrl} /> | |
| </Stage> | |
| </Suspense> | |
| </Canvas> | |
| </div> | |
| ) | |
| } | |
| export default App; | |