🙄
【React Three Fiber】Reactで作る3D【#6useFrame animation】
【#6useFrame animation】
YouTube: https://youtu.be/F5v5vCwHw6c
今回は「useFrame」を使用して、
3Dのオブジェクトに回転するアニメーションを設定します。
まずは、コードが長くなってきたので、
Boxのオブジェクトを別のコンポーネントに移動します。
「src」フォルダに「components」フォルダを作成して、
その中に「GeoBox.tsx」ファイルを作成します。
src/components/GeoBox.tsx
import { Box } from '@react-three/drei'
import { useFrame } from '@react-three/fiber'
import { useControls, folder, button } from 'leva'
import { useRef } from 'react'
import { Mesh } from 'three'
const GeoBox = () => {
const [{ scale, positionX, positionY, positionZ, color, wireframe }, reset] =
useControls('Box', () => ({
geometry: folder({
scale: {
value: 1,
min: 1,
max: 3,
step: 0.1,
},
positionX: {
value: 0,
min: -3,
max: 3,
step: 0.1,
},
positionY: {
value: 0,
min: -3,
max: 3,
step: 0.1,
},
positionZ: {
value: 0,
min: -3,
max: 3,
step: 0.1,
},
}),
material: folder({
color: '#f00',
wireframe: false,
}),
reset: button(() => {
reset({
scale: 1,
positionX: 0,
positionY: 0,
positionZ: 0,
color: '#f00',
wireframe: false,
})
}),
}))
const boxRef = useRef<Mesh>(null!)
useFrame((state, delta, xrFrame) => {
boxRef.current.rotation.x += 0.01
boxRef.current.rotation.y += 0.01
})
return (
<Box
ref={boxRef}
args={[2, 2, 2]}
scale={scale}
position={[positionX, positionY, positionZ]}
>
<meshStandardMaterial color={color} wireframe={wireframe} />
</Box>
)
}
export default GeoBox
src/App.tsx
import { Canvas } from '@react-three/fiber'
import { OrbitControls } from '@react-three/drei'
import GeoBox from './components/GeoBox'
function App() {
return (
<div className="w-full h-screen">
<Canvas>
<ambientLight intensity={0.1} />
<directionalLight position={[0, 0, 5]} />
<GeoBox />
<OrbitControls />
</Canvas>
</div>
)
}
export default App
ここまでできましたら、
「@react-three/fiber」から「useFrame」をインポートして、
アニメーションの設定を実装します。
今回は使用していないのですが、
「useFrame」の第一引数の関数には
「state, delta, xrFrame」を設定することができます。
こちらはアニメーションの設定に便利なメソッド等が含まれています。
そして、アニメーションの対象となる3Dを設定するためには、
「useRef」を使用して、対象となるコンポーネントの
「ref」にプロップスとして設定します。
Discussion