[ReactThreeFiber] Geometry
Geometry
mesh의 모양을 정의한다.
모든 지오메트리는 BufferGeometry 클래스를 상속받는다.
내부 Attribute 데이터
- Position - 형상의 정의하는 3차원 정점
- Normal - 모델의 면에 대한 수직 백터
- Color - 정점의 색상
- UV - 텍스쳐 맵핑을 위한 좌표
- Vertex Index - 삼각형 면 구성을 위한 정점 인덱스
-> 렌더링 시 GPU에 전달된다.
기본 Geometry가 three.js에 정의되어 있다.
mesh에 대한 지오메트리를 지정하는 방법은 지금까지 내가 사용한 방법인
<mesh>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color="fcfcfc" />
</mesh>
이 방법과
import { Box } from "@react-three/drei";
//..
<Box position={[1.2, 0, 0]}>
<meshStandardMaterial color="fcfcfc" />
</Box>;
박스가 mesh와 boxGeometry를 대신한다.
또 하나의 방법은 THREE.BoxGeometry() 를 이용하는 것
function MyBox(props) {
const geom = new THREE.BoxGeometry();
return <mesh {...props} geometry={geom}></mesh>;
}
이렇게 만들어진 컴포넌트를 자식 컴포넌트로 만든다.
삼각형 변에 대한 외곽선 표현과 겹치는 요소 하나로 합치기
<mesh>
<boxGeometry />
<meshStandardMaterial color="fcfcfc" />
</mesh>
<mesh>
<boxGeometry />
<meshStandardMaterial emissive="yellow" wwireframe={true} />
</mesh>
두 개의 mesh를 하나로 만들어 메모리 낭비를 막으려면
const refMesh = useRef()
const refWireMesh = useRef()
useEffect(()=>{
refWireMesh.current.geometry = refMesh.current.geometry
},[])
//..
<mesh ref={refMesh}>
<boxGeometry />
<meshStandardMaterial color="fcfcfc" />
</mesh>
<mesh ref={refWireMesh}>
<meshStandardMaterial emissive="yellow" wwireframe={true} />
</mesh>
geometry args 속성
<mesh ref={refMesh}>
<boxGeometry args={[1, 1, 1, 1, 1, 1]} /> // default 값이다.
<meshStandardMaterial color="fcfcfc" />
</mesh>
일단 args에서 직접 바꾸는게 아닌 UI 라이브러리를 사용해서 효과적으로 boxGeometry를 바꾸어보자.
leva
npm i leva
- 설치
웹에서 마우스를 이용해서 직접적으로 geometry를 조작할 수 있게한다.
import { usecontrols } from "leva";
//..
useEffect(()=>{
refWireMesh.current.geometry = refMesh.current.geometry
},[ xSize, ySize, zSize, xSegments, ySegments, zSegments ])
//..
const { xSize, ySize, zSize, xSegments, ySegments, zSegments } = useControls({
xSize: { value: 1, min: 0.1, max: 5, step: 0.01 },
ySize: { value: 1, min: 0.1, max: 5, step: 0.01 },
zSize: { value: 1, min: 0.1, max: 5, step: 0.01 },
xSegments: { value: 1, min: 1, max: 10, step: 1 }, // step은 항상 1이상
ySegments: { value: 1, min: 1, max: 10, step: 1 },
zSegments: { value: 1, min: 1, max: 10, step: 1 },
})
<boxGeometry args={[ xSize, ySize, zSize, xSegments, ySegments, zSegments ]} />
useEffect의 의존성 배열인자에 args의 요소를 넣음으로 외곽선 또한 크기 조절이 되도록한다.
댓글남기기