|
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 _ 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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fbx.scene.traverse(node => { |
|
|
|
if(node.type === 'Mesh' || node.type == 'SkinnedMesh') { |
|
|
|
node.frustumCulled = false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (node.name.toLowerCase().includes("hair")) { |
|
node.material.transparent = true; |
|
node.material.depthWrite = false; |
|
node.material.side = 2; |
|
node.material.color.setHex(0x222222); |
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|