반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- webrtc
- babel
- androidId
- Redux
- RouteObserver
- methodChannel
- Game js
- node
- react
- swagger-typescript-api
- jszip
- uint16array
- Babel standalone
- uint8array
- identifierForVender
- KakaoMap
- FirebaseAnalytics
- Prism.js
- Three js
- Flutter
- Excel
- typescript
- code editor
- Image Resize typescript
- Raycasting
- userevent_tracker
- Three-fiber
- Completer
- web track
- REST API
Archives
- Today
- Total
Never give up
Three js - Fiber example 본문
반응형
전에 언급한 Fiber를 한번 사용해봤는데
생산성이 어마어마하게 올라갈 수 있겠다는 생각이 들었습니다
그럼 바로 예제로 들어가보겠습니다
index.tsx
import { Canvas } from "@react-three/fiber";
import React from "react";
import Box from "./Box";
import Camera from "./Camera";
const FiberExample = () => {
return (
<Canvas>
<Camera />
<ambientLight />
<pointLight position={[10, 10, 10]} />
<Box position={[-1.2, 0, 0]} />
<Box position={[1.2, 0, 0]} />
</Canvas>
);
};
export default FiberExample;
Fiber에 정의되어있는 Canvas 태그 내부에 Camera, light, Box(mesh) 등을 넣어주면 되는데
scene에 add하는것과 동일한 맥락으로 보시면 됩니다
Camera.tsx
import { useThree } from '@react-three/fiber';
import { useEffect } from 'react';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
const Camera = () => {
const { camera, gl } = useThree();
useEffect(() => {
const controls = new OrbitControls(camera, gl.domElement);
controls.minDistance = 3;
controls.maxDistance = 20;
return () => {
controls.dispose();
};
}, [camera, gl]);
return null
}
export default Camera
orbit control을 사용하기 위해 다음과 같은 작업을 해줘야되는데
camera와 renderer.domElement를 가져와서 셋팅해줄 때
조금 더 편하도록 Fiber 내부에 있는 useThree를 사용하면 간단하게 가져올 수 있습니다
Box.tsx
import { Vector3, useFrame } from "@react-three/fiber";
import React, { useRef, useState } from "react";
import { Mesh } from "three";
type BoxProps = {
position: Vector3;
};
const Box = (props: BoxProps) => {
const mesh = useRef<Mesh>(null);
const [active, setActive] = useState(false);
const [hover, setHover] = useState(false);
useFrame((state, delta) => {
if (mesh.current !== null) {
mesh.current!.rotation.x += delta;
mesh.current!.rotation.y += delta;
}
});
return (
<mesh
ref={mesh}
position={props.position}
scale={active ? 1.2 : 1}
onClick={() => setActive(!active)}
onPointerOver={() => setHover(true)}
onPointerOut={() => setHover(false)}>
<boxGeometry args={[1, 1, 1]} />
<meshStandardMaterial color={hover ? "white" : "green"} />
</mesh>
);
};
export default Box;
개인적으로 mesh를 적용하는 부분이 가장 만족스러웠는데
먼저 raycaster를 사용하지 않고 정말 간단하게 hover, active를 구현할 수 있었고
mesh태그 내부에 원하는 속성들 정의하는 부분이
React 컴포넌트 사용하듯이 사용할 수 있어서 정말 편했던거 같습니다
반응형
'Three js' 카테고리의 다른 글
Three js - GLTF example (0) | 2023.05.07 |
---|---|
Three js - mouse event(feat. Raycaster) (2) | 2023.04.28 |
Three js - gauge example (0) | 2023.04.08 |
Three js - tutorial (0) | 2023.04.08 |
Comments