質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

3548閲覧

Three.jsでユーザーの3dファイルデータを読み込みたい

gochuumonha

総合スコア74

Three.js

Three.jsはWebGLをサポートしているJavaScriptの3D描画用ライブラリです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/02/18 19:05

ご覧いただきありがとうございます。

Three.jsでユーザーの3dファイルを読み込みたいと考えております。

現在している実装としましては、

1.<input>タグを用いて3Dモデルファイルをユーザーに指定してもらいます。

HTML

1<input type="file" value="ファイルを選択" multiple id="file-input" name="image">

2.読み込んだファイルからURLを生成しています。
(この時、サーバーにはデータを送らないようにしています)
そして、そのURLをThree.jsから読み込むことで、Sceneに3Dモデルデータをインポートしています。

JavaScript

1document.getElementById( 'file-input' ).onchange = function () { 2 3  if( this.files !== undefined && this.files !== null ) { 4 5 let files = this.files; 6 7 for(let i = 0; i < files.length; ++i){ 8 let file = files[i]; 9 10 let file_name = file.name; 11 let file_extension = file_name.split('.').pop(); 12 if( file_extension === 'gltf' || file_extension === 'glb' ) 13 { 14 let objectUrl = URL.createObjectURL( file ) ; 15 load_gltf_model( objectUrl, scene ); 16 } 17 18 } 19 20  } 21} 22 23function load_gltf_model( url, scene ){ 24 // Load GLTF or GLB 25 const loader = new THREE.GLTFLoader(); 26 loader.load( 27 url, 28 // onLoader 29 function ( gltf ){ 30 const model = gltf.scene; 31 scene.add(model); 32 }, 33 // onError 34 function ( error ) { 35 console.log( 'An error happened' ); 36 console.log( error ); 37 } 38 ); 39}

これによって、サーバーにファイルを送らずとも、3Dモデルファイルを読み込んでいます。
3Dモデルデータが「.glb」のように1つのファイルにまとまっていればうまくいくのですが、「.gltf + texture1.png + texture2.png ...」のように複数ファイルの場合はうまくいきません。
この理由が、生成されたURLが、

blob:http://localhost/9c10bf59-1f61-430c-bfd8-775d54f83bef blob:http://localhost/47bd0f41-cea7-410a-a4f7-67af973d8b07 blob:http://localhost/676bd075-1f1f-4879-8c64-3f5ebce59200 blob:http://localhost/be7288ab-584a-4608-a6dd-10524fedc1e5 blob:http://localhost/60ff0ab4-14f2-4db3-9762-2d86b9e3b111 blob:http://localhost/59c537a7-7e69-4d44-9e8b-ff30320d6893 。 。 。

のようにファイル名と生成されるURLに対応付けがなく、モデルロード時にテクスチャを見つけられずにエラーが出てしまいます。(blob:http://localhost/0001_img0.pngのような感じだとうまくいくと思われる。)
しかし、仕様上、URL.createObjectURLで生成されるURL名は変更できないようで、解決方法が見つけられておりません。

現在は、Three.jsのローダープログラムそのものを変更してしまうか、複数ファイルの場合に限って、ファイルをサーバーに挙げることを考えておりますが、スマートな解決方法に見えず悩んでおります。

ユーザーの3Dモデルデータを読み込む実装として、このほかにありそうでしたら、ぜひご教授いただきたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

楽なのはモデルデータにまとまっていればモデルデータのみ、textureが分かれているなら別のformを用意してアップロードしてもらい、それぞれモデルローダー, textureLoaderで読み込む方法かと思います。
どうしても1つのフォームにアップロードさせたいという話であればすみません。

投稿2019/02/19 02:27

yu-smc

総合スコア610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gochuumonha

2019/02/21 14:52

ご回答ありがとうございます。 そうですね、今回は1つでやりたいと考えております。
guest

0

的を外していたらごめんなさい。

複数のpngをinput fileでアップロードする場合、multiple にされてますが、name属性に[]を付ければ大丈夫ではないか、と思いました。。

<input type="file" value="ファイルを選択" multiple id="file-input" name="image[]">

投稿2019/02/19 00:36

SaintKnowledge

総合スコア368

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gochuumonha

2019/02/21 14:51

つけ忘れておりました。 ご回答ありがとうございます。
guest

0

自己解決

サンプルにやりたかった挙動に近いものを見つけました。
こちらを見ながら試してみようと思います。

https://github.com/mrdoob/three.js/tree/master/editor

投稿2019/02/21 14:53

gochuumonha

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問