./src/App.jsx
import { Canvas } from '@react-three/fiber'
import Polyhedron from './Polyhedron'
import * as THREE from 'three'
import { Stats, OrbitControls } from '@react-three/drei'
export default function App() {
return (
<Canvas camera={{ position: [-1, 4, 2.5] }}>
<directionalLight position={[1, 1, 1]} />
<Polyhedron
name="meshBasicMaterial"
position={[-3, 1, 0]}
material={new THREE.MeshBasicMaterial()}
/>
<Polyhedron
name="meshNormalMaterial"
position={[-1, 1, 0]}
material={new THREE.MeshNormalMaterial()}
/>
<Polyhedron
name="meshPhongMaterial"
position={[1, 1, 0]}
material={new THREE.MeshPhongMaterial()}
/>
<Polyhedron
name="meshStandardMaterial"
position={[3, 1, 0]}
material={new THREE.MeshStandardMaterial()}
/>
<OrbitControls target-y={1} />
<axesHelper args={[5]} />
<gridHelper />
<Stats />
</Canvas>
)
}
./src/Polyhedron.jsx
import { useRef } from 'react'
import { useControls } from 'leva'
import * as THREE from 'three'
import { useFrame } from '@react-three/fiber'
export default function Polyhedron(props) {
const ref = useRef()
useFrame((_, delta) => {
ref.current.rotation.x += 0.2 * delta
ref.current.rotation.y += 0.05 * delta
})
useControls(props.name, {
wireframe: {
value: false,
onChange: (v) => {
ref.current.material.wireframe = v
},
},
flatShading: {
value: true,
onChange: (v) => {
ref.current.material.flatShading = v
ref.current.material.needsUpdate = true
},
},
color: {
value: 'lime',
onChange: (v) => {
ref.current.material.color = new THREE.Color(v)
},
},
})
return (
<mesh {...props} ref={ref}>
<icosahedronGeometry args={[1, 1]} />
</mesh>
)
}