useThree
const {
camera, // Three.js의 카메라
scene, // Three.js의 씬
gl, // Three.js의 WebGLRenderer
size, // 현재 Canvas 크기 (width, height)
viewport, // 3D 씬 관점의 뷰포트 크기 (카메라 FOV 등 고려한 크기)
clock, // Three.js의 시간 관리용 Clock
raycaster, // 마우스 등으로 3D 객체를 선택하는 Raycaster
mouse, // 마우스 위치 (정규화된 좌표)
// ...
} = useThree();
import { useThree } from "@react-three/fiber";
import { useEffect } from "react";
function CameraController() {
const { camera } = useThree();
useEffect(() => {
camera.position.set(0, 2, 5);
camera.fov = 60;
camera.updateProjectionMatrix();
}, [camera]);
return null;
}
useFrame
매 프레임마다 실행되는 콜백을 등록해, 애니메이션이나 프레임별 업데이트를 처리할 수 있게 해주는 훅이다.
e.g.
import { useFrame } from "@react-three/fiber";
import { useRef } from "react";
import * as THREE from "three";
function RotatingBox() {
const meshRef = useRef<THREE.Mesh>(null);
useFrame((state, delta) => {
// 매 프레임마다 회전
if (meshRef.current) {
meshRef.current.rotation.x += delta;
meshRef.current.rotation.y += delta;
}
});
return (
<mesh ref={meshRef}>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color="hotpink" />
</mesh>
);
}
인자로 넘겨받는 (state, delta)
에서 delta
는 이전 프레임 대비 시간 차이, state
는 현재 R3F 내부 상태(camera
, scene
, clock
, pointer
등)를 담고 있다.
애니메이션 외에도 매 프레임마다 물리 엔진 업데이트, Raycaster를 이용한 마우스 피킹 등 반복적으로 수행해야 하는 로직을 추가할 때 유용하다.
useLoader