LoginSignup
0
0

More than 1 year has passed since last update.

WebGLでミラーボールを作るハンズオン(react-three-fiber + drei + TypeScript)

Last updated at Posted at 2021-11-26

WebGLでミラーボールを作ってみます。ハンズオン的に全ての手順を説明します。
ツールとしてはreact-three-fiber + drei + TypeScript + create-react-appを使います。

本記事の想定読者

Web開発に詳しいが、3Dは詳しくない人向けです。

今回作成するもの

動くデモはこちら

gamen_test1.gif

解説

1. 3Dモデル作り

まずBlender(ここではバージョン2.92.0)を起動します。

立方体をクリックしてキーボードの「X(エックス)」を押下し、画面に表示された「削除」を押す。

スクリーンショット 2021-11-26 21.53.03.png

Command + A (Windowsでは Ctrl + A) を押して「メッシュ」→「UV球」

スクリーンショット 2021-11-26 21.54.26.png

球ができたら球をクリックし、以下の1→2をクリック

スクリーンショット 2021-11-26 21.50.07.png

「メタリック」と「粗さ」を図のとおり設定する。

  • メタリック: 0.926
  • 粗さ: 0.074

スクリーンショット 2021-11-26 21.50.38.png

モデルを.glb形式に変換する。「ファイル」→「エクスポート」→「glTF 2.0(.glb/.gltf)」と選択

スクリーンショット 2021-11-26 21.50.45.png

名前を「ball.glb」と設定して、あとは何も変えずに「glTF2.0をエクスポート」を押す。

スクリーンショット 2021-11-26 21.51.53.png

モデルはこれで完成となります。

2. 実装

ここから実装をしていきます。まずライブラリのインストールをします。

yarn create react-app my-app --template typescript  
yarn add three @react-three/fiber @types/three 
yarn add @react-three/drei

# そして開発サーバーの起動
cd my-app
yarn
yarn start

まず、3Dモデルを配置しておきます。srcディレクトリ直下に、先ほど作ったball.glbを入れます。

それではコードを修正していきます。

src/global.d.tsファイルを作成し、以下を書き込みます。
これにより、先ほど作った.glbファイルがTypeScriptから読み込めるようになります。

declare module "*.glb";

src/index.cssの先頭に以下のコードを追加します。
これはレイアウト調整のためです。

html,
body,
#root,
#root > div {
  height: 100%;
}

src/App.tsxを以下のコードに入れ替えます。
これにより、3Dモデルが読み込まれ、画面に表示されます。

import "./App.css";
import React, { Suspense } from "react";
import { Canvas, useFrame } from "@react-three/fiber";
import { useGLTF, Environment, OrbitControls } from "@react-three/drei";
import modelPath from "./ball.glb";
import { GLTF } from "three/examples/jsm/loaders/GLTFLoader";

function Model() {
  const gltf = useGLTF(modelPath) as unknown as GLTF;
  useFrame(() => (gltf.scene.rotation.y += 0.002));
  return <primitive object={gltf.scene} />;
}
function App() {
  return (
    <div className="App">
      <Canvas>
        <OrbitControls />
        <color attach="background" args={[0x333353]} />
        <ambientLight />
        <pointLight position={[10, 10, 10]} />
        <Suspense fallback={null}>
          <Environment preset="studio" />
          <Model />
        </Suspense>
      </Canvas>
    </div>
  );
}

export default App;

以上です。

ソースコード

今回作ったものは以下にあります。うまく動かない場合参考にしてください。

確認環境

  • Node.js v14.17.1
  • Blender 2.92.0
  • MacBook Pro (16-inch 2019)
  • macOS Monterey 12.0.1
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0