htmlを書くだけ!マーカーWebAR

バジル
2019-10-29
バジル
2019-10-29

マーカーを使ったARにしてみよう

さて、前回の続きです。
今回はマーカー上に前回作成した地球を表示してみたいと思います。

前回のソースコードを下記のようにします。
```
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello, WebVR! • A-Frame</title>
    <meta name="description" content="Hello, WebVR! • A-Frame">
    <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
    <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script>
  </head>
  <body>
    <a-scene embedded>
      <a-sphere
          animation="property: rotation; from: 0 0 0; to: 0 360 0; dur:10000; loop: true; easing: linear;"
          position="0 1.25 -5"
          radius="1.25"
          src="https://cdn.glitch.com/f1432045-b246-46c1-a562-f07b21784e53%2Fearth.jpg?v=1571897568427"
          shadow
      ></a-sphere>
      <a-sky src="https://cdn.glitch.com/f1432045-b246-46c1-a562-f07b21784e53%2Fspace.jpg?v=1571898513741"></a-sky>
    </a-scene>
  </body>
</html>
```

追加したのは
```
<script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script>
```
と、a-sceneのタグの中がembeddedに変わっただけです。

これで画面を表示してみると、
カメラを通して地球がずっと写っている状態になるかと思います。

マーカーにかざしたときだけ表示

次にマーカーにかざしたときのみ、
表示されるように変更します。
```
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello, WebVR! • A-Frame</title>
    <meta name="description" content="Hello, WebVR! • A-Frame">
    <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
    <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script>
  </head>
  <body>
    <a-scene embedded arjs>
      <a-marker preset="hiro">
        <a-sphere
            animation="property: rotation; from: 0 0 0; to: 0 360 0; dur:10000; loop: true; easing: linear;"
            position="0 1.25 -5"
            radius="1.25"
            src="https://cdn.glitch.com/f1432045-b246-46c1-a562-f07b21784e53%2Fearth.jpg?v=1571897568427"
            shadow
        ></a-sphere>
      </a-marker>
      <a-sky src="https://cdn.glitch.com/f1432045-b246-46c1-a562-f07b21784e53%2Fspace.jpg?v=1571898513741"></a-sky>
    </a-scene>
  </body>
</html>
```

マーカー上に表示したいものをa-markerで囲みます。
今回は「hiro」というテンプレートのマーカーを使用しました。
また、a-sceneにarjsを追加しました。

これで、hiroというマーカーにかざしたときのみ
表示されるようになったはずです。

hiro.jpeg

オブジェクトの位置、その他を調整する

無事表示できたと思いますが、
下の画像のように場所がずれているかと思います。
また、変な文字も表示されていて邪魔くさいですね。

marker.png

位置の調整と余計な文言をとっぱらいたいと思います。

オブジェクト位置の修正

何故場所がずれているかというと、a-sphereの中を見てみましょう
```
<a-sphere
    animation="property: rotation; from: 0 0 0; to: 0 360 0; dur:10000; loop: true; easing: linear;"
    position="0 1.25 -5"
    radius="1.25"
    src="https://cdn.glitch.com/f1432045-b246-46c1-a562-f07b21784e53%2Fearth.jpg?v=1571897568427"
    shadow
></a-sphere>
```
この部分のpositionが0 1.25 -5となっていることが問題です。
原点はマーカーの中心となります。
こいつを0 2 0と変更してみましょう。

これで真ん中、マーカーより上に2という部分に出てくれるはず・・・

madazure.jpg

まだずれてました。
なぜか。
これは「カメラの位置が原点にある」ことを前提としているからです。
でも、実際は原点にありません。

なので、カメラはここだよーを明示的に表してあげます。

```
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello, WebVR! • A-Frame</title>
    <meta name="description" content="Hello, WebVR! • A-Frame">
    <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
    <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script>
  </head>
  <body>
    <a-scene embedded arjs>
      <a-marker preset="hiro">
        <a-sphere
            animation="property: rotation; from: 0 0 0; to: 0 360 0; dur:10000; loop: true; easing: linear;"
            position="0 2 0"
            radius="1.25"
            src="https://cdn.glitch.com/f1432045-b246-46c1-a562-f07b21784e53%2Fearth.jpg?v=1571897568427"
            shadow
        ></a-sphere>
      </a-marker>
      <a-sky src="https://cdn.glitch.com/f1432045-b246-46c1-a562-f07b21784e53%2Fspace.jpg?v=1571898513741"></a-sky>
      <a-entity camera></a-entity>
    </a-scene>
  </body>
</html>
```

a-entyty cameraで原点がここだよ、と指定してあげます。

xurenasi.png

これで解決しました。

デバグを消去する

最後にデバグを消去します。
```
<a-scene embedded arjs="debugUIEnabled: false;">
```
a-sceneのarjsにデバグ表示をしない、という文言を追加するだけです。

complete.jpg

これで完成です。
思ったより簡単だったでしょう。

まだまだ色々なことができるので、
興味がある方は公式ページを色々見てみてください!