EコマースWEBサイトで３Dコンテンツを表示する方法

オンラインショッピング中に購入したい商品を確認したいとき、EコマースWEBサイトの写真を確認したり、Youtubeなどのレビュー動画を見るのが一般的です。しかしそれでは商品を色々な角度から確認することやディテールの確認ができないことが多いと思います。現状では慎重に買い物するためには、わざわざ店舗へ行って確認しないと詳細の確認はできません。貴重なものや効果なもの、たとえばフィギュアなどの一点物や手作りの芸術品、インテリア装飾などは現在のWEBサービスでは店舗に行って確認しないと不安です。

![Display-a-furniture-3D-model-in-VR-AR-space.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/32c4866a-3d59-f8c3-1e07-b9d1046da886.jpeg)

そこでもし、商品をEコマースサイトに簡単に３D化して表示、確認できる方法はないかと思いませんか？

現時点では、商品などの３Dモデル表示は、スマホアプリを使うケースはよく見かけます。しかし現在の技術では、EコーマスサイトなどのWebサイトできれいに商品の３Dモデルが表示できます。

このブログではECサイトで商品の３Dモデルをきれいに表示させることにより、お客様が商品を信頼して買いたくなる方法を紹介します。

具体的には下記のデモサイトのようにBabylon.jsで3DコンテンツをWEB表示させる方法を紹介していきます。

https://sinon1509.github.io/product-view.github.io/
![image-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/7ccbab4a-a7b3-2a3d-2ca7-b51ab7aa7e4a.png)


3DコンテンツをWEB表示させる方法を紹介していきます。

<h2>Babylon.jsとは</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/e95887fb-c5e3-9963-9b50-70bcf2965454.png)

Babylon.jsはMicrosoftが開発したJavascriptを使用したリアルタイム３Dエンジンです。現在、Webサイトで３Dモデルのレンダリングエンジンがたくさんありますが、なぜBabylon.jsがいいのかについては下記の記事を参考にしてください。

https://onetech.jp/blog/creating-3d-web-apps-with-Babylon.js-framework-15194

Babylon.jsはフロントエンド開発をサポートしています。他にもReact.js、Vue.js、Angularもありますが、一長一短があり、自チームの強みによって選ぶべきです。

ONETECHはVue.jsが得意なのでフロントエンド作成はVue.jsを利用しています。

今回はVue.jsで簡単な商品の紹介ページを作成します。３Dコンテンツでの商品の表示はBabylon.jsを利用します。

<h2>Vue.jsとは</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/727fbf04-c010-2181-7abc-19807d2e29e1.png)

Vue.jsはGoogleのエンジニアが開発され、React.jsとAngularの両者のメリットを盛り込んで作りました。なので、メリットがたくさんあります。詳細は下記の記事を参考にしてください。
https://onetech.jp/blog/what-is-vue-js-15855

<h1>プロジェクト作成について</h1>
<h2>Node.jsをインストール</h2>
「https://nodejs.org/」にアクセスするとダウンロードボタンが表示されます。インストールファイルをダウンロードすると普通のアプリのインストール方法と同様に簡単にインストールできます。私は推奨版をおすすめします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/f0e5c875-0a51-0521-56e3-a58eb329c733.png)


<h2>Vue.jsをインストール</h2>
https://ja.Vue.js.org/guide/quick-start.html#creating-a-vue-application

Vue.jsのホームページで日本語のガイドがありますので、確認をお願いします。

この記事はEコマースサイトの３Dコンテンツを中心に説明しますので、Vue.jsについては簡単に説明させていただきます。

<h2>Babylon.jsをインストール</h2>
Vue.jsのプロジェクトが作成できたら、コマンドラインでプロジェクトのフォルダに移動します。確認のコマンドで移動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/cec169d4-8dda-8f8d-6281-6a6bc4396cf3.png)


次はBabylon.jsをインストールします。下記のコマンドを実施してインストールできます。

npm install @babylonjs/core

npm install @babylonjs/loaders

<h2>ページ作成について</h2>

続いてプロジェクトの構成を説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/c1aa1244-12be-bdee-9e7d-2633b7c62833.png)


distは配信用(distribution): 開発完了し、ビルドしたフォルダです。Webをデプロイする時、このフォルダを使います。

Node_modules：インストールされたライブラリ(Vue.js、Babylon.js、webpackなど)を格納します。

Public：３Dコンテンツと画像の格納場所

Src は編集用(source)。：ソースコードの格納場所、プログラムを記述

Tsconfig.json：Typescriptのプロジェクトを作成し、tsconfigファイルを自動的に作成

Vue.config.js：ビルドの設定

まずは画像のようにファイルの構成を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/2b622ce8-7f3d-c165-ddbc-4ef6d8610da6.png)

BabylonJSフォルダ→Product3D.ts

Componentsフォルダ→Product.vue

Product3D.tsを開いて最初のコードを書きます。

ライブラリをインポートする
必要なライブラリをインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/e18f0441-6043-afc3-865c-256c0c18d379.png)


<h2>Babylon.jsアプリの基本構成</h2>
Engine: Babylon.jsのエンジンを起動する。

Scene：新規のシーンを登録します。複数のシーンを登録して切り替えることができますが、今回実施しません。

Camera：シーンのカメラを登録します。モデルを見るように

AbstractMesh：モデルの対象です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/eba61e03-4787-ee4a-f742-306f67ae51b2.png)

シーンの登録方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/058075d5-a9b0-caeb-59da-bd95828a56f5.png)
新しいシーンを登録して背景を作成します。背景のTextureはインターネットでダウンロードしました。

カメラを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/cf447131-0286-a420-be06-b16547e2cd67.png)

ArcRotateCameraとはモデルを中心としてカメラを周りに回転させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/ffca7c27-b23a-d8df-f99f-efa70556d5c7.png)

ArcRotateCameraを登録して画像のようにパラメーターを設定します。

New ArcRotateCamera (<名前>,<alpha>,<beta>,<radius>,<target>,<scene>)

AttachControl: マウスでカメラを回転する設定

wheelPrecision: カメラのズームのスピード

minZ :　ズームできる最小値。設定しないとモデルの中身までズームしてしまうので注意が必要

min・maxRadius : カメラのズームのリミット

panningSensibility: カメラを固定

autoRotateBehaviour: カメラが自動でターゲット中心に回転

idleRotationSpeed: 回転速度

idleRotationSpinuptime: 自動的に下のビューから中心のビューに移動する時間

idleRotationWaitingTime: マウスで操作して回転を一時停止する時間

zoomStopAnimation: ズームする時、回転を一時停止

FramingBehaviour: 起動する時、カメラを自動的に配置

FramingTime: カメラの配置時間

モデル表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/5e3ae1cd-d971-5b37-e952-b4f7a52f652a.png)

デモは下記のリンクで無料ダウンロードできます。Glbファイルをダウンロードしてください。

https://polyhaven.com/a/horse_statue_01

モデルの中は馬オブジェクトと台オブジェクトがありますので、馬のオブジェクトの順番は１なのでmeshes[1]を取得してカメラのターゲットに設定します。

<h1>Vue.jsコンポーネントの設定</h1>
Product.vueファイルを開いて開発したモデル表示部分を表示します。

Vue.jsのコンポーネント開発とCSSは今回スキップいたします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/104dac68-cc9c-26a3-6372-92bccbddacd9.png)

WindowsResize機能はブラウザのウィンドウズのサイズを変更する時、3Dビューを再度更新します。Product3D.tsファイルを開いて下記の機能を追加してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/6d34e992-8d63-84a4-308d-e77057070fb8.png)

WindowsResize機能
最後App.vueファイルを開いてProductコンポーネントを呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663479/afa800bd-4b94-1dc4-ba9f-93869c024d4b.png)

最後の結果はこのリンクを参考にしてください。

https://sinon1509.github.io/product-view.github.io/

<h1>まとめ</h1>
いままでのEコマースWEBサイトでは3Dモデルの表示は難しかったです。またできたとしても品質はよくなかったです。Eコマースでお客様に商品を紹介したい場合、スマホアプリやクラウドレンダリングなどの方法で実現できるようになりましたが、アプリをダウンロードする必要があったりコストが高いという問題があったりします。現時点ではBabylon.js、Three.jsのライブラリを利用するとWEBブラウザで3Dモデルの表示ができ、品質が高くてコスト削減もできます。スマホアプリの開発コストも節約できるし、高額のクラウドレンダリングサーバーも不要です。

また、Vue.js、React.jsなどはバックエンドに連携しやすいです。クラウドサーバーでコンテンツの保存場所（Amazon S3など）を登録すれば、フロントエンド側でコンテンツをダウンロードして表示することもできます。

またBabylon.jsはWebXRもサポートしますので、３DコンテンツをARで表示することもできます。

近い将来には、高価な商品や確認しづらい商品でもお店に行かなくてもWEBで確認できる時代がやってくると確信しています。