three.jsからpanoramaARを試してみましょう!

ワン
2020-08-26
ワン
2020-08-26

前置き

こんにちは!
久しぶりですね!
今回は面白いテーマを持ってきました!🥺
ささっとやってみましょうか!

内容

今回は用意するライブラリーがあります。

「Three.js」です!

https://github.com/mrdoob/three.js/
こちらは、「three.js」ライブラリーの公式ホームページです!

必要なのは「three.js/build/three.min.js」と「three.js/examples/js/controls/OrbitControls.js」です。

流れとしては、

1. 3D空間上に球体を配置
2. パノラマ静止画をテクスチャーとして貼り付け
3. 球体の中心にカメラを配置する

によって、ぐるぐると視点を切り替えると360°の全方向を見渡せる360°パノラマビューワーの完成!


では、コードでみましょう!

```
<html>
<head>
<meta charset=utf-8>
<title>panorama</title>
<style>
body { margin:0 }
canvas { width : 100%, height : 100% }
</style>
</head>
<body>
<canvas id="myCanvas">
<script type="module" src="ダウンロードパス/three.min.js"></script>
<script type="module" src="ダウンロードパス/OrbitControls.js"></script>
</body>
</html>
```

scriptのtypeはインポートするので「module」にします!

```
import * as THREE from 'ダウンロードパス/three.min.js';
import { OribitControls } from 'ダウンロードパス/OrbitControls.js':
```

では、コードを書きましょう!

```
function init() {
   // 画面のサイズに合わせます
   const width = window.innerWidth 
   const height = window.innerHeight

   // レンダラーを作成
   const renderer = new THREE.WebGLRenderer({
        canvas: document.querySelector('#myCanvas')
   });
   renderer.setSize(width, height);
   renderer.setClearColor(0xf8f8f8);

   // シーンを作成
   const scene = new THREE.Scene;

   // カメラを作成
   let camera = new THREE.PerspectiveCamera(45, width / height, 1, 10000);
   camera.position.set(0, 0, +1000);

   // 球体を作成
   let geometry = new THREE.SphereGeometry(300, 30, 30);

   // マテリアルにテクスチャーを設定
   const material = new THREE.MeshBasicMaterial({ color: 0x8dc3ff });

   // メッシュを作成
   const mesh = new THREE.Mesh(geometry, material);

   scene.add(mesh);

   tick();

   // 毎フレーム時に実行されるループイベントです。
   function tick() {
        // メッシュを回転させる
        mesh.rotation.y += 0.01;
        // レンダリング
        renderer.render(scene, camera);
   
        requestAnimationFrame(tick);
   }
}


window.addEventListener('load', init);
```

にすると!その結果、
回転する「0x8dc3ff」色の球体が見えます!
スクリーンショット 2020-08-26 15.18.16.png

ここからは、この「マテリアル」にcolorではなく、「テクスチャー」を設定してみます!

上のコードから
```
   // マテリアルにテクスチャーを設定
   const material = new THREE.MeshBasicMaterial({ color: 0x8dc3ff });
```

ここを

```
   // 画像の設定
   const load_image = new THREE.TextureLoader();
   const texture = load_image.load('イメージパス/イメージファイル.jpg');
   // マテリアルにテクスチャーを設定
   const material = new THREE.MeshBasicMaterial({ map: texture });
```

このように、変更しましょう!

今回私が使う画像は
「https://unsplash.com/s/photos/panoramic」ここから持ってきました!
 panorama.jpg

では、画像を設定すると!
スクリーンショット 2020-08-26 15.34.41.png
こんな感じの、panorama球体の「外側」が完成されます!😅

では、panoramaの中に入ってみましょうか!
ここで、今回の主人公「OrbitControls」です!

カメラの設定の後に「OrbitControls」の設定を書きます!
```
   // 中からの視点に変えるため、カメラの位置を変更します
   camera = new THREE.PerspectiveCamera(90, width / height, 0.1, 1000);
   camera.position.set(0, 1.6, 3);
   geometry.scale(-1, 1, 1);

   // OrbitControlsの設定
   let controls = new OrbitControls(camera, renderer.domElement);

   // メッシュを追加した後に、カメラの位置を更新します
   controls.update();
   controls.autoRotate = true; 
```

にすると、その結果!
スクリーンショット 2020-08-26 15.46.13.png

こんなパノラマの世界が目の前に広がります!😎
マウスをクリックしてドラッグしたら、視線の方向も変えられます。

最後に

今回は「パノラマ」というテーマでやってみましたが、いかがでしたか?
私は個人的にかなり、面白かったので、皆さんもぜひ、試してみてください!

ではでは〜