2
0

More than 1 year has passed since last update.

Next.jsでThree.jsをサクッと動かしてみる

Last updated at Posted at 2022-07-05

はじめに

Three.jsの技術を習得した3次元的なUIを作成できるフロントエンジニアは今後非常に重宝されると思われるため、先んじて技術をキャッチアップしていこうと思っています
Three.js自体はJavaScriptを生のまま書く前提のライブラリのため、フロントエンドのフレームワークではまた書き方が変わってくるため、そのままの形でのThree.jsの導入は現実的ではないとされているのですが、Next.js(React)にはそこをサポートしてくれるライブラリがあるとのことだったので、サクッと動かしてみたのですが、かなり簡単に使用できて感動したので、その使い方を紹介します

Three.js とは?

Three.jsを知らない人向けに一応補足すると、3次元的なUIを作ることができるライブラリです
大きな特徴としてJavaScriptのライブラリのため、Webアプリケーションとの相性が非常によいというのが最大の特徴です
これまでは3次元的なUIはUnityなどで作られ、ゲーム業界でしか長らく使われてこなかったですが、今後はVRの進展に伴って通常のWebサービスにも3次元的な続々と導入されていくことが期待されています
その一翼を担うと期待されているのが、Three.jsです

この説明でイメージがわかない人は、three.jsの公式ドキュメントを見たり、ドキュメントに案内されているLive exampleにアクセスしてまずは動きを確かめてみるのがいいでしょう

Next.jsの導入

まずはNext.jsを導入しましょう
こちらを参考に導入してください
Next.jsのプロジェクトができていてTypeScriptが導入できている前提で話を進めます

導入方法はこちら

Three.jsの導入

react-three-fiberというReact用のライブラリがあるのでこちらをインストールします
ちなみにdreiというライブラリもあるようで、react-three-fiberに満足できなければこちらを試してみるのもよさそうです
では、以下のコマンドで必要なライブラリをインストールしましょう

npm install three @types/three @react-three/fiber

さて、Next.jsとTypeScriptと上記のライブラリがインストール出来たらpages/index.tsxを以下のように書き換えてみましょう

pages/index.tsx

import * as THREE from 'three'
import React, { useRef, useState } from 'react'
import { Canvas, useFrame } from '@react-three/fiber'

function Box(props: JSX.IntrinsicElements['mesh']) {
  const ref = useRef<THREE.Mesh>(null!)
  const [hovered, hover] = useState(false)
  const [clicked, click] = useState(false)
  useFrame((state, delta) => (ref.current.rotation.x += 0.01))
  return (
    <mesh
      {...props}
      ref={ref}
      scale={clicked ? 1.5 : 1}
      onClick={(event) => click(!clicked)}
      onPointerOver={(event) => hover(true)}
      onPointerOut={(event) => hover(false)}>
      <boxGeometry args={[1, 1, 1]} />
      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />
    </mesh>
  )
}

export default function Home() {
  return (
    <Canvas>
      <ambientLight />
      <pointLight position={[10, 10, 10]} />
      <Box position={[-1.2, 0, 0]} />
      <Box position={[1.2, 0, 0]} />
  </Canvas>
  )
}

そして実行

yarn dev

すると以下のようば箱オブジェクトを生成したものが回転しているものが表示されました

kakepic.gif

なお、ジオメトリの引数を変えるとちゃんとオブジェクトの形が変わることが確かめられたりするので後はいろいろ試してみてください
例:<boxGeometry args={[2, 1, 1]} />

以上のように簡単にThree.jsを使い始めることができました

おわりに

Next.jsを使えば思ったよりもかなり簡単にThree.jsを使うことができて驚きました
元々はVue.jsで開発を行おうとしていましたが、Three.jsのVue用ライブラリがVue3.0に対応していないとのことだったので、3次元的なUIを作る場合はNext.js(React)一択になるかと思います(Angularは調べてないです)
とにもかくにもThree.jsは非常に楽しいですね
今後もThree.jsの使い方を調べて発信していこうと思いますのでよろしくお願いします

2
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
2
0