Grimoire.js使ってみた

先日弊社にGrimoire.jsのコミッターの方々に来社いただいてハンズオンを行っていただいたので忘れないうちにメモを残します。

## Grimoire.jsとは
Web開発者がかんたんにWebGLを使えるようにするためのフレームワーク
だと理解しています。（間違ってたら編集リクエストいただけると助かります）

## 準備

### ローカルサーバーを立てる

なんでもいいですがNode.jsで

```
$ npm install -g http-server
$ hs
Starting up http-server, serving ./
Available on:
  http://127.0.0.1:8080
  http://172.20.10.3:8080
Hit CTRL-C to stop the server
```


## 使い方

### 立方体を描画してみる

```html:index.html
<!DOCTYPE html>
<html lang="en">

<head>
  <!-- Grimoire.js plugins -->
  <script src="https://unpkg.com/grimoirejs-preset-basic/register/grimoire-preset-basic.js"></script>
</head>

<body>
  <!-- GOML-->
  <script id="main" src="index.goml" type="text/goml"></script>
</body>

</html>
```

`<!-- Grimoire.js plugins -->`の部分はCDNからGrimoire.jsのコアやよく使うプラグインなどがまとまったコードを取得しています。
`<!-- GOML-->`の部分は`index.goml`というファイルを読み込んでいます。ファイルの中にはGrimoire.jsが解釈できるGOMLというマークアップ言語で描画する要素などを定義します。XMLの記法でかけるうようになっています。

```xml:index.goml
<goml>
  <scene>
    <camera>
      <camera.components>
      </camera.components>
    </camera>
    <mesh geometry="cube" color="red" position="0,0,0">
    </mesh>
  </scene>
</goml>
```

上記のファイルではgomlというルートノードの中にsceneタグがあり、その中にcameraとmesh要素が存在します。meshでどんな要素を描画するかを定義していて、このサンプルだと`geometry="cube"`という属性がついているので立方体が描画されます。
![grimoire_red.png](https://qiita-image-store.s3.amazonaws.com/0/20045/5588a6e7-4a33-eb6a-de48-2d64fb59936b.png)

### 立方体を動かしてみる

このままだと立方体なのにただの四角に見えるのでマウスで動かせるようにしてみます。
index.gomlを下記のように編集します。

```xml:index.goml
<goml>
  <scene>
    <camera>
      <camera.components>
        <MouseCameraControl/>
      </camera.components>
    </camera>
    <mesh geometry="cube" color="red" position="0,0,0">
    </mesh>
  </scene>
</goml>
```

`camera`要素の中に`camera.componenｔｓ`要素とその中に`MouseCameraControl`というタグが入りました。cameraやmeshにコンポーネントを追加することで機能を追加できます。
これでもう一度アクセスすると

![cube_move.gif](https://qiita-image-store.s3.amazonaws.com/0/20045/ab6cd32b-9db3-a92d-d1c9-d309a2261ecc.gif)


マウスでぐりぐり動かせます。

### 面に画像を貼り付けてみる

せっかくなので面になにか画像を貼ってみます。
index.gomlを下記のように編集します。

```xml
<goml>
  <scene>
    <camera>
      <camera.components>
        <MouseCameraControl/>
      </camera.components>
    </camera>
    <mesh geometry="cube" texture="./image.png" position="0,0,0">
    </mesh>
  </scene>
</goml>
```

公式サイトにあるようにGrimoire.jsのロゴ画像をimage.pngという名前でgomlファイルと同じディレクトリに置いて、mesh要素に`texture="./image.png"`という属性を追加しました。
再度アクセスすると

![grimoire_logo.gif](https://qiita-image-store.s3.amazonaws.com/0/20045/87670188-bdb7-dbae-b5dc-edb25e2534a2.gif)

textureという属性名の通り、立方体の面に画像を貼り付けることができました。

### JSでいじる

ブラウザっぽくJSでいじります。

htmlファイルを下記のように編集します。

```html:index.html
<!DOCTYPE html>
<html lang="en">

<head>
  <!-- Grimoire.js plugins -->
  <script src="https://unpkg.com/grimoirejs-preset-basic/register/grimoire-preset-basic.js">
</script>
  <script src="./index.js"></script>
</head>

<body>
  <!-- GOML-->
  <script id="main" src="index.goml" type="text/goml"></script>
</body>

</html>
```
gomlファイルをincludeしているscriptタグにmainというIDをつけただけです。

index.jsというファイルを作ってJS下記のように記述します。
JSの記述は
http://qiita.com/kyasbal_1994/items/cff1466719934f461ca8
から拝借しました。ありがとうございます。

```js:index.js
gr(function() {
    var colors = ['blue', 'red', 'lime'];
    var i = 0;
    setInterval(function() {
        gr('#main')('mesh')
            .setAttribute('color', colors[i % 3]);
        i++;
    }, 1000);
});
```

JQueryのセレクタのように`#main`でgomlが記述されたスクリプトを指定して、その中のmesh要素に対して一定間隔で色の属性を切り替えています。

再度アクセスすると
![grimoire_color.gif](https://qiita-image-store.s3.amazonaws.com/0/20045/f124e02f-d781-1104-5bdf-c5b6781a6360.gif)
色が切り替わっています　:smiley:

## 所感

HTMLやJSからかなりかんたんに３Dモデルを描画したりいじったりできるという印象です。私が他のWebGL系のライブラリを使ったことがなかったのでそことの比較はできないのですが、そのあたりは
http://qiita.com/kyasbal_1994/items/cff1466719934f461ca8
こちらの記事や公式サイト
https://grimoire.gl/
リポジトリ
https://github.com/GrimoireGL/GrimoireJS
からまずはさわってみるのがいいのかなと思っています。

以上です。