react-three-fiberを使用したReactとThree.jsの詳細
公開: 2022-03-10react-three-fiber
は、Reactとそのネイティブアプリケーションの3Dモデルとアニメーションのレンダリングを支援する強力なThree.jsレンダラーです。 このチュートリアルでは、Reactアプリケーションで3Dモデルを構成および構築する方法を学習します。 今日は、configureと使用方法を学習するつもりreact-three-fiber
構築して反応して反応ネイティブアプリケーションで3Dモデルとアニメーションを表示します。
このチュートリアルは、Reactを使用してWebで3Dモデルアニメーションについて詳しく知りたい開発者、およびキャンバスを作成できない、 click
イベントなどのユーザーイベントをバインドしてレンダリングループを開始する、 react-three-fiber
などのThree.jsに制限がある人を対象としています。 react-three-fiber
にはこれらの方法が付属しています。 react-three-fiber
を使用してThree.js3Dモデルを構築する方法をよりよく理解するために、3Dモデルを構築します。
react-three-fiber
入門
Three.jsは、あなたがよりここに学ぶことができる、それが簡単にブラウザで3Dグラフィックスを作成することができライブラリが、それは3Dモデルやアニメーションを表示するには、キャンバス+ WebGLの使用です。
react-three-fiberは、Web上のThree.js用のReactレンダラーであり、react-nativeです。これは、Three.jsを使用して3Dモデルとアニメーションを作成する速度を向上させます。3Dモデルとアニメーションを使用するサイトの例です。ここで見つけることができます。 react-three-fiber
、そのための再利用可能なコンポーネントのアニメーションに費やす時間を削減し、イベントを結合し、ループをレンダリングし、最初のはThree.jsが何であるかを見てみましょう。
react-three-fiber
を使用すると、React状態、フック、および小道具を使用してthreeJS
コードのコンポーネントを構築できます。また、次の要素が付属しています。
エレメント | 説明 |
---|---|
mesh | モデルの形状を定義するのに役立つプロパティ |
hooks | react-three-fiber は、 onClick やonPointOver などのユーザーイベントの定義に役立つ関数の作成に役立つフックを定義します |
コンポーネントベースのレンダリングループ | react-three-fiber はコンポーネントベースであり、状態またはストアの変化に応じてレンダリングされます |
使用方法react-three-fiber
react-three-fiber
を使用するには、以下のコマンドを使用することから始めます。
NPM
npm i three react-three-fiber
糸
yarn add three react-three-fiber
注: react-three-fiber
を機能させるには、上記のようにthree
(Three.js)をインストールする必要があります。
React3Dルドーダイスモデルとアニメーションプロジェクトの構築
ここでは、下のビデオのように、 react-three-fiber
を使用して3Dルドーダイスモデルを構築します。
create-react-app
を使用してプロジェクトを初期化します。これを行うには、ターミナルで以下のコマンドを実行します。
create-react-app react-three-fiber-ludo-model
上記のコマンドは、当社のローカルマシン、次のletの中にプロジェクトを反応させるの初期化cd
のディレクトリに、我々のパッケージがインストールreact-three-fiber
とthree
。
cd react-three-fiber-ludo-model npm i three react-three-fiber
パッケージがインストールされたら、コマンドを使用して開発サーバーを起動しましょう
npm start
上記のコマンドは、ブラウザでプロジェクト開発サーバーを起動する必要があります。 次は私たちのプロジェクト内で、選択の私達のテキストエディタで私たちのプロジェクトを開いてみましょうsrc
:以下のファイルを削除、フォルダApp.css
、 App.test.js
、 serviceWorker.js
とsetupTests.js
。 次に、 App.js
で削除されたファイルを参照するすべてのコードを削除しましょう。
このプロジェクトでは、ルドーダイス用のBox
コンポーネントと、Reactによって提供されるApp
コンポーネントが必要になります。
Box
コンポーネントの構築
Box
コンポーネントには、ルドーサイコロの形状、ルドーサイコロの画像、および常に回転を維持するための状態が含まれます。 まず、以下のBox
コンポーネントに必要なすべてのパッケージをインポートしましょう。
import React, { useRef, useState, useMemo } from "react"; import { Canvas, useFrame } from "react-three-fiber"; import * as THREE from "three"; import five from "./assets/five.png";
上記のコードでは、 useRef
、 useMemo
、 useState
をインポートしています。 useRefフックを使用してサイコロのメッシュにアクセスし、 useRef
フックを使用してuseState
サイコロのアクティブな状態を確認します。 useMemo
フックは、サイコロの数字を返すために使用されます。 次に、 react-three-fiber
からCanvas
とuseFrame
をインポートします。 canvas
はブラウザでグラフィックを描画するために使用されますが、 useFrame
を使用すると、コンポーネントをレンダリングループにフックできます。これにより、1つのコンポーネントをレンダリングできます。別のコンテンツ。 次に、 three
パッケージをインポートしてから、ルドーダイスの静止画像をインポートしました。
次に、 Box
コンポーネントのロジックを記述します。 まず、機能コンポーネントの構築から始めて、コンポーネントに状態を追加します。以下でそれを実行しましょう。
const Box = (props) => { const mesh = useRef(); const [active, setActive] = useState(false); useFrame(() => { mesh.current.rotation.x = mesh.current.rotation.y += 0.01; }); const texture = useMemo(() => new THREE.TextureLoader().load(five), []); return ( <Box /> ); }
上記のコードでは、作成しているBox
我々はREFを作成隣に、小道具を持つコンポーネントと呼ばれるmesh
使用useRef
フックを、我々は常に同じで毎回メッシュ返すことができ、このようにしました。
メッシュはシーン内の視覚要素であり、三角形のポリゴンを構成する3Dオブジェクトです。通常、モデルの形状を定義するために使用されるジオメトリとモデルの外観を定義するマテリアルを使用して構築されます。ここでメッシュについて学びますuseRef
フックについてもここで学ぶことができます。

初期化した後mesh
、私たちが使用して我々のアプリケーションの状態を初期化する必要がありuseState
フックを、ここではfalseにアプリケーションの推移とアクティブ状態を設定します。
次に、以下のコードを使用して、 react-three-fiber
のuseFrame
フックを使用してメッシュ(ルドーダイス)を回転させます
mesh.current.rotation.x = mesh.current.rotation.y += 0.01;
ここでは、メッシュの現在の位置を0.01秒ごとに回転させています。これは、回転に優れたアニメーションを与えるために行われます。
const texture = useMemo(() => new THREE.TextureLoader().load(five), []);
上記のコードでは、 texture
という定数を作成し、新しいサイコロロールをロードする関数としてreact useMemo
フックを渡します。ここでは、サイコロの画像とその番号を記憶するためのuseMemo
です。 useMemo
フックについてはここで学ぶことができます。
次に、ブラウザでBox
コンポーネントをレンダリングし、イベントを追加します。これを以下で行います。
const Box = (props) => { return ( <mesh {...props} ref={mesh} scale={active ? [2, 2, 2] : [1.5, 1.5, 1.5]} onClick={(e) => setActive(!active)} > <boxBufferGeometry args={[1, 1, 1]} /> <meshBasicMaterial attach="material" transparent side={THREE.DoubleSide}> <primitive attach="map" object={texture} /> </meshBasicMaterial> </mesh> ); }
上記のコードでは、 Box
コンポーネントを返し、spread演算子を使用してBox
コンポーネントのすべてのプロパティを渡したmesh
でラップし、 useRef
フックを使用してメッシュを参照しています。 次に、Three.jsのscale
プロパティを使用して、アクティブな場合はダイスボックスのサイズを設定し、アクティブでない場合は1.5に設定します。 最後になりましたが、デフォルトで設定されていない場合にstate
をactive
に設定するonClick
イベントを追加しました。
<boxBufferGeometry args={[1, 1, 1]} />
サイコロボックスをレンダリングするために、Three.jsからboxBufferGeometry
コンポーネントをレンダリングしました。boxBufferGeometryは、ボックスなどの線やポイントを描画するのに役立ちますboxBufferGeometry
args
を使用して、ボックスジオメトリのサイズなどのコンストラクターを渡しました。
<meshBasicMaterial attach="material" transparent side={THREE.DoubleSide}>
Three.jsのmeshBasicMaterial
は、単純な形式でジオメトリを描画するために使用されます。 ここでは、 attach
属性を渡し、 THREE.DoubleSide
小道具をside
属性に渡しました。 THREE.DoubleSide
は、 react-three-fiber
によってレンダリングされる側面またはスペースを定義します。
<primitive attach="map" object={texture} />
Three.jsのprimitive
コンポーネントは、3Dグラフを描画するために使用されます。 ルドーダイスの元の形状を維持するために、マッププロパティを添付しました。 次に、 App.js
ファイルでBox
コンポーネントをレンダリングし、3dルドーダイスボックスを完成させます。 コンポーネントは次の画像のようになります。

3Dルドーダイスボックスのレンダリング
このセクションでは、 App.js
でBox
コンポーネントをレンダリングし、3d ludoボックスを完成させます。最初に、 App
コンポーネントを作成し、 Canvas
タグでラップします。これは、3Dモデルをレンダリングするためのものです。以下でそれをやってみましょう。
const App = () => { return ( <Canvas> </Canvas> ); } export default App;
次に、ボックスにライトを追加しましょうreact-three-fiber
は、モデルを照らすための3つのコンポーネントを提供します。これらは次のとおりです。
-
ambientLight
これは同様に、そのような光の強度として小道具を受け付けるシーンまたはモデル内の光のすべてのオブジェクトに使用され、これはルードサイコロの本体を点灯します。 -
spotLight
この光は一方向から放射され、物体のサイズが大きくなるにつれて大きくなり、ルドーダイスのポイントを照らします。 -
pointLight
これは、電球の光と同様に動作し、光が一点から全方向に放射され、これは我々のアプリケーションのアクティブ状態のために必要であろう。
以下のアプリケーションに上記を実装しましょう。
const App = () => { return ( <Canvas> <ambientLight intensity={0.5} /> <spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} /> <pointLight position={[-10, -10, -10]} /> </Canvas> ); } export default App;
上記のコードでは、 react-three-fiber
からambientLight
コンポーネントをインポートし、それに0.5の強度を追加しました。次に、 spotLight
コンポーネントとpointLight
コンポーネントに位置と角度を追加しました。 アプリケーションの最後のステップは、ボックスコンポーネントをレンダリングし、ルドーダイスボックスに位置を追加することです。これは、以下のコードで行います。
<Box position={[-1.2, 0, 0]} /> <Box position={[2.5, 0, 0]} />
完了すると、ルドー3Dサイコロは次の画像のようになります。

実用的なデモはCodeSandboxで入手できます。
結論
react-three-fiber
により、ReactおよびReactNativeアプリケーション用の3Dモデルとアニメーションのレンダリングが簡単になりました。 当社の3Dルードサイコロボックスを構築することによって、私たちは、その構成要素と利点の横のThree.jsの基本について学んできたreact-three-fiber
同様にそれを使用する方法として。
独自にreact-three-fiber
を使用して、ReactおよびNativeアプリケーションで3Dモデルとアニメーションを構築することにより、これをさらに進めることができます。 あなたが思いついた新しいものを見てみたいです!
以下のリファレンスで、Three.jsとreact-three-fiber
詳細を読むことができます。
関連リソース
- Three.jsドキュメント
- Three.jsの基礎
- React-Poimandresによる3ファイバーGitHubリポジトリ
- react-3ファイバーのドキュメント
- React Hooks(useState、useMemoなど)の公式ドキュメント