./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> ) }