LoginSignup
0
1

More than 1 year has passed since last update.

three.jsのプロジェクトを作ってGitHubにあげてHerokuに公開するまでのステップ 2/2

Last updated at Posted at 2021-10-29

Blenderで鉛筆のモデルとアニメーションを作ったので、three.jsを使用してwebブラウザに表示させたものをHerokuにアップしてみようと思います。
GitHubのリポジトリ作成から環境構築、Herokuのデプロイまでを備忘録として記載します。

今回の記事では、実際にthree.jsでシーンを作成〜Herokuのデプロイまでを行います。
それ以前の手順は以下の記事に記載しています。
three.jsのプロジェクトを作ってGitHubにあげてHerokuに公開するまでのステップ 1/2

もくじ

1. three.jsシーンの作成する
2. Herokuにデプロイする

1. シーンの作成

three.jsにBlenderで作成したモデルを取り込み、ブラウザに表示させます。

この記事ではthree.jsやBlenderでのモデルの作成方法は記載していません。

(1) staticフォルダに必要なファイルを配置する

前回作成したstaticフォルダに以下のファイルを配置します。

  • Blenderで作成したモデル
  • draco(上記のモデルをDracoという方式で圧縮したので読み込む際に必要。)

dracoはnode_modulesのthreeの中にあるフォルダをstaticにコピペします。
node_modules > three > examples > js > draco
shot1.png

このようなフォルダ構成になります。
shot2.png

(2) three.jsでモデルを読み込みアニメーションさせる

前回と変更した部分を絞ってソースを紹介します。
ソースの全体はGitHubのリポジトリで確認できます。

index.js
// Loaderをインポートする
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'

// Loader
const dracoLoader = new DRACOLoader()
dracoLoader.setDecoderPath('/static/draco/') // サーバにあげた際のディレクトリを指定する
const gltfLoader = new GLTFLoader()
gltfLoader.setDRACOLoader(dracoLoader)

// Model
let mixer = null
gltfLoader.load(
  '/static/pencil_merged_animate.glb',
  (gltf) => {
    mixer = new THREE.AnimationMixer(gltf.scene)
    const action = mixer.clipAction(gltf.animations[0])
    action.play()
    gltf.scene.scale.set(0.5, 0.5, 0.5)
    gltf.scene.position.set(0, -1, 0)
    scene.add(gltf.scene)
  }
)

// Test cube もういらないので削除
// const cube = new THREE.Mesh(
//   new THREE.BoxGeometry(1, 1, 1),
//   new THREE.MeshNormalMaterial()
// )
// cube.rotation.set(0.3, 0.3, 0)
// scene.add(cube)

// Lights
const ambientLight = new THREE.AmbientLight(0xffffff, 0.8)
scene.add(ambientLight)

const dirLight = new THREE.DirectionalLight(0xffffff, 1.5)
dirLight.position.set(0, 0, 6)
scene.add(dirLight)

// Animate
const clock = new THREE.Clock()
let previousTime = 0
const tick = () => {
  const elapsedTime = clock.getElapsedTime()
  const deltaTime = elapsedTime - previousTime
  previousTime = elapsedTime

  if(mixer) {
    mixer.update(deltaTime)
  }

  renderer.render(scene, camera)
  window.requestAnimationFrame(tick)
}

tick()

ついでに背景を黄色にしてみます。

style.css
.webgl
{
    position: fixed;
    top: 0;
    left: 0;
    outline: none;
    background-color: #FFDB46;
}

(3) 前回コメントアウトしたCopyWebpackPluginを復活させる

前回動作確認のためにコメントアウトしたプラグインのコメントアウトを外します。

webpack.config.js
// staticフォルダの中をコピーして展開してくれる
new CopyWebpackPlugin({
  patterns: [
    { from: path.resolve(__dirname, './static'), to: path.resolve(__dirname, 'dist/static') }
  ]
}),

(4) 動きを確認する

yarn serve

上記のコマンドでローカルサーバを立ち上げるとアニメーションが表示されます。
※ Macの場合はCommand + C、Windowsの場合は Ctrl + C でローカルサーバを停止できます。
ezgif.com-gif-maker.gif

2 デプロイする

作成したthree.jsのプロジェクトをHerokuにデプロイします。

(1) Herokuにプロジェクトを作成する

まずはログイン。

heroku login

プロジェクトを作成します。

heroku create {プロジェクトの名前}

プロジェクトが作成されると、コンソールにHerokuのプロジェクトのurlが表示されます。
そのurlを開くと以下のような画面が表示されます。
shot3.png

(2) リモートリポジトリを登録

Herokuのリモートリポジトリを登録します。

heroku git:remote --app {プロジェクトの名前}

(3) Node.jsで動かすための設定

Heroku上ではNode.jsでアプリを動かすため、エントリーポイントとなる「server.js」を作成します。
まずはexpressをnode_modulesにインストールします。

yarn add express

アプリを動かすためのコードを記述したserver.jsを作成します。

server.js
const express = require('express'); // 先ほどインストールしたパッケージ
const serveStatic = require('serve-static');
const app = express();
app.use(serveStatic(__dirname + "/dist")); // buildした後に作成されるフォルダ名 = dist
const port = process.env.PORT || 8000; // port番号は適宜変更してください
app.listen(port);
console.log('server started '+ port);

package.jsonにHerokuでアプリを動かす際のコマンド(start)を追記します。

package.json
"scripts": {
  "start": "node server.js",
  "serve": "webpack-dev-server",
  "build": "webpack"
}

以下のコマンドを実行した後、 localhost:8000(server.jsで指定したポートNo) にアクセスしてアプリが表示されるか確認します。

yarn start

(3) Herokuにデプロイ

設定が完了したら、以下のコマンドgit経由でHerokuにデプロイします。

git add .
git commit -m "deploy to heroku"
git push heorku master

デプロイが完了したらHerokuのページから[Open app]のボタンで実際にアプリを見てみます。
shot5.png

無事表示されました!
shot6.png

参考にした記事

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