6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Three.jsAdvent Calendar 2019

Day 22

Three.jsとIndexedDBでMMDモデルビューアーを作った

Last updated at Posted at 2019-12-22

はじめに

Three.jsにはMMDモデルを読み込んでくれるMMDLoaderというツールがあり、これでMMDモデルを確認できるビューアーアプリを作りたいと思ったのですが、MMDモデルをサーバーにアップロードする形だと著作権的にグレーな気がしました。

そのとき、「ローカルで見るだけならわざわざサーバーに送る必要ないのでは?」ということに気づき、サーバーに送らなくて済むタイプのMMDモデルビューアを作ってみることにしました。

そのために一時的にブラウザからアクセス可能なローカルの領域を用意する必要があるのですが、今回はそれにIndexedDBを使いました。
(Githubのissueを調べたところ、IndexedDBについては何かしら議論したあとがあったのですが、この感じだとまだサポートは無いんだと思います)

作ったもの

デモ

こちらのデモをご覧ください。
MMDモデル(pmd/pmx)のファイルを選択すると、そのMMDモデルが表示されるはずです。
※MMDモデルはてきとうに「MMDモデル 配布」とかでググって見つけてください。
※申し訳ありませんがまだテクスチャは貼れません...

プログラム

  • app/MMDSaver.jsというのがIndexedDBのあれこれを操作してるjsです。
  • app/js/loaders/MMDLoader.jsはarraybufferを直接読み込めるように改造してあります。

仕組み

MMDLoaderに限らず、Three.jsの3Dモデルローダーは第一引数に静的ファイルのパスを渡す仕様になっていると思います。MMDLoader内ではこのパスに基づいて xhrリクエストをサーバーに送信し、レスポンスとしてArrayBuffer形式のモデルファイルを受け取っています。 このことから、ローダーにパスではなく直接ArrayBufferを渡せばいいと思いました。

流れ

  1. フォームからバイナリ形式のファイルを取得
  2. ファイルをreadAsArrayBufferでArrayBufferに変換
  3. IndexedDBに保存
  4. IndexedDBから取り出し
  5. 一度blobに変換しローダーに渡す ※なぜかArrayBufferのままではローダーに渡せなかったため
  6. ローダー内でblobに対しreadAsArrayBufferをかけArrayBufferに戻す
  7. 本来xhr処理するはずだった場所でこのArrayBufferを受け取る

さいごに

初心者なので間違ったことを書いてしまっているかもしれません。もし何かあればコメントください!!

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?