ご覧いただきありがとうございます。
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モデルデータを読み込む実装として、このほかにありそうでしたら、ぜひご教授いただきたいです。
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/21 14:52