three.js / editor

# はじめに
[Three.js Advent Calendar 2019](https://qiita.com/advent-calendar/2019/threejs)の 7 日目の記事です。
[Three.js Meetup Tokyo #0](https://threejs.connpass.com/event/153560/)で[初LT](https://f-a24.github.io/slides-sandbox/types-three)してきた勢いそのままに登録したものの何も思い浮かばずピンチな感じが満載ですが…

今回は意外と検索しても出てこないthree.js / editorを紹介できたらと思います。
思いっきりただのツール紹介になりますがご了承ください…

# three.js / editor

Three.jsのオンラインエディターになります。

https://threejs.org/editor/

公式サイトにもリンク先があるのですが見逃したりしているのか、もしくはそもそも使ってる人がいないのかあまり話題になっていないような気がします（気のせい？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/775811e1-f612-3146-a1c1-87888d5689cb.png)

こちらを開くとこのようにエディターの画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/2eb1d84d-b8c8-4891-25c9-f64981331cf1.png)

# 基本操作

## 立方体を作成

では、簡単~~（手抜き）~~に立方体を作成していきます。
ツールバーの「Add」から作成するオブジェクトを選択します。
Boxを選択すると黒い立方体が表示されるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/69fdddb1-1735-458f-4d0c-9d99d240e9ae.png)

この立方体は画面下部にあるTRANSLATE・ROTATE・SCALEを選択することでドラッグ＆ドロップによる移動・回転・サイズ変更することができます。
（画面右にあるOBJECTタブからも変更できます）

## 色を変更

画面右にあるMATERIALタブから立方体の色や質感などを編集することができます。
今回は簡単~~（手抜き）~~に赤にしてみましょう。
Emissiveを選択し、表示されたカラーピッカーから赤を選択すると立方体が赤くなると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/69acb29e-8859-2d9a-ac09-dd011c4b08cf.png)

# Export

作成したSceneやGeomeryはいくつかの形式でexportすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/dde48615-8077-a9e3-3786-508ee837a491.png)

こちらでexportするとjsonがダウンロードされ、このエディタでimportすることもできますしthree.jsのObjectLoaderで読み込むことも可能です。（Export Geometry・Export Object・Export Scene）

```ts
// Export Sceneをexportしてダウンロードされたscene.jsonを読み込む
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(new THREE.Color(0xaaaaaa));
document.getElementById("WebGL-output").appendChild(renderer.domElement);

const camera = new THREE.PerspectiveCamera(
  45,
  window.innerWidth / window.innerHeight,
  1,
  1000
);
camera.position.set(0, 5, 10);
camera.lookAt(0, 0, 0);

const loader = new THREE.ObjectLoader();
loader.load('scene.json', (obj: THREE.Object3D) => {
  const scene = obj as THREE.Scene;
  const render = () => {
    requestAnimationFrame(render);
    renderer.render(scene, camera);
  };
  render();
});
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/1aa06409-3729-774e-6dbe-bfa732c72e8b.png)

Publishはhtmlやjsファイルの一式をzip形式でダウンロードすることができます。

# Example

Exampleもいくつか用意されていますので、それを見て色々手を加えて遊んでみると楽しめるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/9a109319-accb-4888-115e-b094a5886834.png)

# PWA

個人的に「おっ！」と思ったのが、このエディターはPWA（Progressive Web App）になっているところです。
今回はThree.jsの記事ですのでPWAの説明は省略しますが、一言でいうとインストールできるWebアプリケーションです。

[はじめてのプログレッシブ ウェブアプリ](https://developers.google.com/web/fundamentals/codelabs/your-first-pwapp/?hl=ja)

Chromeでこのエディターを起動するとオムニバーにアイコンが現れインストールすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/1d689d24-f660-bce5-0efe-c2f0e2362b2d.png)

インストールするとデスクトップにアイコンが表示され起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173087/efe04a53-01d0-1ea1-f478-9ebb407fcb28.png)


# おわりに

簡単~~（手抜き）~~な紹介だけとなってしまいましたが、今後も色々使ってみて何か良さ気なものがあったら紹介しようと思います。
（今回は入門の入門ということで…）

ツールをインストールなどせずに手軽に3DCGをやってみたい方やThree.jsに入門したいけれどまずはイメージを掴みたい方などにはお勧めできるかなと思いました。

また、UnityやBlenderなどをゴリゴリ使っている強々勢の方は興味があれば、issueやPRを出してみて機能改善していくのも良いかもしれませんね。