react 3 섬유에 대한 주석
Originally published on my blog
이것은 내가 정리한 필기집인데, 목적은React에서 어떻게 3D 기술을 사용하는지 더욱 잘 이해하는 것이다.내가 이 글을 쓰는 것은 나 자신을 위해서이다. 왜냐하면 이것이 바로 내가 이 글을 쓰는 목적이기 때문이다. 그러나 다른 사람들이 그것이 유용하다고 생각한다면 그것도 매우 멋있다.그러나 그것은 교과서나 그 어떤 것으로도 작성된 것이 아니다.경고한다!
설치 프로그램
설치:
yarn add react-three-fiber three @react-three/drei
전체 페이지를 100% 너비와 높이로 설정하기* {
box-sizing: border-box;
}
html,
body,
#root {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
이것들은 모두 무엇이냐
캔버스 어셈블리는 DOM 요소가 아닌 세 개의 JS 요소를 나타냅니다.그것은 전체 용기의 높이와 너비를 필요로 하기 때문에, 전체 페이지의 3D 렌더링을 하려면 용기의 너비와 높이를 100%로 설정해야 한다.
우리는 화포에서 HTML 요소를 직접 사용할 수 없다. 비록 이 점을 할 수 있는 방법이 있지만, 나는 뒤에서 소개할 것이다.
Canvas 어셈블리는 세 개의 JS 요소를 렌더링하므로 메쉬, 구 측정, meshStandard Material 등을 사용할 수 있습니다.이것은 상하문을 통해 이 모든 내용을 보여주는 하위 요소에 제공하고threejs API를 정상적으로 사용할 수 있는React 구성 요소로 변환합니다. 그러면 우리는 도구를 이 요소/구성 요소에 전달할 수 있습니다.
메쉬, 형상 및 재료
메쉬는 와이어프레임이나 모델과 같은 객체의 기본 뼈대와 유사합니다.
형상은 메쉬가 사용할 모양입니다. 재료는 메쉬를 덮어쓰는 내용과 메쉬의 모양입니다.객체와의 상호 작용과 동작을 변경할 수 있는 다양한 유형의 재료를 사용할 수 있습니다.
HTML 요소와 같은 다양한 기하학적, 재질은 캔버스에서 직접 사용할 수 있다.예를 들어 메쉬 표준 재료나 구 측정법.
위의 형상 및 재료의 부착 도구는 요소를 부모 요소에 부착합니다. 이 경우 메쉬가 설정값으로 사용됩니다.따라서 구면계는 메쉬에 형상으로 부착되고 메쉬 표준 재료는 메쉬에 재료로 부착됩니다.
구조 함수 매개 변수는argsprop과 함께 전달됩니다.잉크 측량법은 많은 구조 함수 파라미터를 채택하였는데, 앞의 세 가지 파라미터는 반경, 너비, 높이이다.자세한 내용은 SphereGeometry docs on threejs를 참조하십시오.예를 들어, 구의 구조 함수 매개변수는 다음과 같습니다.
등불
만약 광원을 제공하지 않는다면 물체는 검은색이 될 것이다.이것은 일리가 있다. 빛이 없으면 우리는 현실 생활에서 티타늄을 볼 수 없기 때문이다.라이트 리스트는 Asmashing magazine article에서 가져옵니다.
서로 다른 재질의 구체.
이 세 개의 코드
<Canvas>
<mesh
visible // object gets render if true
userData={{ test: "hello" }} // An object that can be used to store custom data about the Object3d
position={[0, 0, 1]} // The position on the canvas of the object [x,y,x]
rotation={[0, 0, 0]} // The rotation of the object
castShadow // Sets whether or not the object cats a shadow
// There are many more props.....
>
{/* A spherical shape*/}
<sphereGeometry attach="geometry" args={[1, 16, 16]} />
{/* A standard mesh material*/}
<meshStandardMaterial
attach="material" // How the element should attach itself to its parent
color="#7222D3" // The color of the material
transparent // Defines whether this material is transparent. This has an effect on rendering as transparent objects need special treatment and are rendered after non-transparent objects. When set to true, the extent to which the material is transparent is controlled by setting it's .opacity property.
roughness={0.1} // The roughness of the material - Defaults to 1
metalness={0.1} // The metalness of the material - Defaults to 0
/>
</mesh>
{/*An ambient light that creates a soft light against the object */}
<ambientLight intensity={0.5} />
{/*An directional light which aims form the given position */}
<directionalLight position={[10, 10, 5]} intensity={1} />
{/*An point light, basically the same as directional. This one points from under */}
<pointLight position={[0, -10, 5]} intensity={1} />
{/* We can use the drei Sphere which has a simple API. This sphere has a wobble material attached to it */}
<Sphere visible position={[-3, 0, 1]} args={[1, 16, 16]}>
<MeshWobbleMaterial
attach="material"
color="#EB1E99"
factor={1} // Strength, 0 disables the effect (default=1)
speed={2} // Speed (default=1)
roughness={0}
/>
</Sphere>
{/* This sphere has a distort material attached to it */}
<Sphere visible position={[3, 0, 1]} args={[1, 16, 16]}>
<MeshDistortMaterial
color="#00A38D"
attach="material"
distort={0.5} // Strength, 0 disables the effect (default=1)
speed={2} // Speed (default=1)
roughness={0}
/>
</Sphere>
</Canvas>
델레
Drei는 react three fiber의 많은 지원과 요약을 포함하는 유용한 패키지입니다.내가 주의한 것은Nextjs에서drei를 사용하면 내용을 가져오려고 시도할 때 오류가 발생합니다. 모듈 밖에서 import 문장을 사용할 수 없습니다.Nextjs가 서버에서 공공 js 모듈을 사용하기 때문입니다.다음 Transfile 모듈에서 withTM를 사용할 수 있습니다.drei에서 흔히 볼 수 있는 js 내용을 전송하기 위해 파일을 설정합니다.drei 구성 요소를 사용하여 구성 요소를 동적으로 가져오고 서버 쪽 렌더링을 비활성화해야 합니다.this issue 및 this PR 참조
Nextjs를 사용하고 있다면...
import dynamic from "next/dynamic";
const ThreeBall = dynamic(
() => import("./../../src/components/post/three-ball"),
{ ssr: false }
);
다음.배치하다.js
const withTM = require("next-transpile-modules")([
"three",
"drei",
"postprocessing",
]);
module.exports = withTM();
주요 참가자
react three fiber (R3F) 의 렌더기는 id나 클래스 이름을 통해 특별히 추가하지 않는 한 DOM에 동적으로 추가된 HTML 캔버스 요소입니다.
이 장면은 하나의 무대로 모든 것이 이곳에서 상연된다.메쉬에는 조명, 그룹, 3D 위치 및 카메라가 포함됩니다.하나의 장면은 극장 장면으로 여겨질 수 있다. 그 중에서 격자나 격자 그룹은 재생할 동작이다. 불빛은 격자와 그 기하학적 재료와 재질을 장면에 부여하고 서로 다른 각도에서 격자를 비추며 나타나는 배경을 제공한다.카메라와 위치는 우리로 하여금 서로 다른 각도에서 그것들을 볼 수 있게 한다.
편리한 캔버스 구성 요소
나는 내가 원하는 모든 3D 물건을 렌더링하기 위해 편리한 캔버스 부품을 만들었다.Chakraui를 사용하지만 스타일은 스타일 탭과 쉽게 연결되거나 CSS 파일에 추가할 수 있습니다.
import React, { Suspense } from 'react';
import { Canvas } from 'react-three-fiber';
import { Box } from '@chakra-ui/core';
/**
* A container with a set width to hold the canvas.
* @param {String} width - The width of containing element
* @param {String} height - The height of containing element
* @param {Array} position - The position of the camera, [x, y, z] axis.
* @param {Number} fov - The field of view of the camera. The higher the number, the further away the view
* @param {Number} zoom - If the camera should be zoomed in. Provide a number. Defaults to 1.
* ...rest = any styles you want to apply to the containing div
*/
const CanvasContainer = ({
width,
height,
position,
fov,
zoom,
children,
...rest
}) => {
return (
<Box height={height} width={width} {...rest}>
<Canvas
colorManagement
camera={{
position,
fov,
zoom,
}}
>
<Suspense fallback={null}>{children}</Suspense>
</Canvas>
</Box>
);
};
export default CanvasContainer;
모델
Poimandres팀에서 제공한 도구를 사용하여 모델과 함께 일하는 것이 매우 재미있고 상당히 가볍다.일반적으로 3D 컨텐트를 로드하는 사양인 GLTF를 사용합니다.JSON(.gltf) 또는 바이너리(.glb) 형식을 모두 적용합니다.이렇게 단일 무늬나 자원을 저장하는 것이 아니라jgp 또는.png, gltf는 3D 컨텐트를 표시하는 데 필요한 모든 컨텐트를 패키지화합니다.이는 메쉬, 형상, 재료 및 텍스쳐 등의 모든 영역을 포함할 수 있습니다.자세한 내용은 3개docs를 참조하십시오.
공용 폴더에 저장해야 하는gltf 파일을 가져와서 이 파일을 읽고 React 구성 요소를 만들 수 있는 gltfjsx 패키지를 사용할 수 있습니다.만약gltf모델에 애니메이션이 있다면 패키지도 구성 요소 내부에 애니메이션 논리를 만들어 줍니다.우리는 세 가지 예 중의 새 한 마리를 들 수 있다.
이 새의 코드는 우리를 위해 자동으로 생성된 것이다.보아하니 이렇다.
/*
auto-generated by: https://github.com/pmndrs/gltfjsx
*/
import React, { useRef, useState, useEffect } from "react";
import { useFrame } from "react-three-fiber";
import { useGLTF } from "@react-three/drei/useGLTF";
import * as THREE from "three";
import { PerspectiveCamera } from "@react-three/drei";
export default function Stork(props) {
const group = useRef();
const { nodes, materials, animations } = useGLTF("/stork.glb");
const actions = useRef();
const [mixer] = useState(() => new THREE.AnimationMixer());
useFrame((state, delta) => mixer.update(delta));
useEffect(() => {
actions.current = {
storkFly_B_: mixer.clipAction(animations[0], group.current),
};
actions.current.storkFly_B_.play(); // To play the animation we have to call the play method
return () => animations.forEach((clip) => mixer.uncacheClip(clip));
}, [animations, mixer]);
return (
<group ref={group} {...props} dispose={null}>
<PerspectiveCamera makeDefault position={[-10, 50, 250]} />
<hemisphereLight args={["white", 2, 2]} />
<spotLight
intensity={0.2}
position={[20, 25, 14]}
angle={0.15}
penumbra={1}
castShadow
/>
<mesh
material={nodes.mesh_0.material}
geometry={nodes.mesh_0.geometry}
name="mesh_0"
morphTargetDictionary={nodes.mesh_0.morphTargetDictionary}
morphTargetInfluences={nodes.mesh_0.morphTargetInfluences}
/>
</group>
);
}
useGLTF.preload("/stork.glb");
편리한 모델 어셈블리
나는 또 편리한ltlf 모형 부품을 만들었다.이 어셈블리는 모델의 경로와 같은 여러 도구를 사용합니다.gltf 파일, 모형은 캔버스에 있는 위치에 [x, y,z]의 Vector3 수조 형식으로 추가된 회전 및 모형 격자에 전달할 추가 도구입니다.
import React from 'react';
import { useGLTF } from '@react-three/drei';
import { useFrame } from 'react-three-fiber';
/**
* A basic gltf modal renderer component.
* @param {String} scenePath - The path to the scene file. Should be kept in the public folder
* @param {Array} position - The position on the canvas the model should take
* @param {Array} rotation - Optional rotation of the model. If provided [x, y, z] values are mapped to the useFrame hook which will rotate the model in the given direction(s)
*/
const GLTFModal = ({ scenePath, position, rotation, ...rest }) => {
const gltf = useGLTF(scenePath, true);
const mesh = React.useRef();
useFrame(() =>
rotation
? ((mesh.current.rotation.x += rotation[0]),
(mesh.current.rotation.y += rotation[1]),
(mesh.current.rotation.z += rotation[2]))
: null,
);
return (
<mesh castShadow ref={mesh} {...rest} position={position}>
<primitive object={gltf.scene} dispose={null} />
</mesh>
);
};
export default GLTFModal;
그런 다음 다음과 같이 사용됩니다. <GLTFModal
scenePath="/scene.gltf"
position={[0, -1, 0]}
rotation={[0, 0.01, 0]}
/>
Reference
이 문제에 관하여(react 3 섬유에 대한 주석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/studio_hungry/notes-on-react-three-fiber-4f8g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)