2
2
title : Three.jsでモデルデータを読み込む
3
3
author : 池田 泰延
4
4
published_date : 2017-11-03
5
- modified_date : 2023-02 -06
5
+ modified_date : 2023-03 -06
6
6
---
7
7
8
8
** 3Dモデリングソフトで制作したモデルデータの読み込み方** を説明します。3Dのモデルデータにはさまざまな形式が存在しますが、Three.jsは対応している形式がです。
@@ -13,7 +13,7 @@ Three.jsでは外部ソフトを利用して作成した3Dモデリングデー
13
13
14
14
Three.jsでは次の形式の読み込みに対応しています。
15
15
16
- * GLTF形式
16
+ * GLTF形式(ジーエルティーエフ形式) : インターネット向けの3Dファイル形式。2017年に仕様として定められた新しい形式。
17
17
* OBJ形式 : Wavefront社のAdvanced Visualizerというソフト用のファイルフォーマット。テキストデータ。
18
18
* Collada(dae)形式 : 汎用的なデータファイル。XMLで構成されている。
19
19
* FBX形式(バイナリー)
@@ -26,11 +26,88 @@ Three.jsでは次の形式の読み込みに対応しています。
26
26
27
27
Three.jsでモデルデータを読み込むには、JavaScriptでThree.jsの初期化を済ませたあとで、ローダーを使ってファイルを読み込み、3D空間に追加するという手順をとります。
28
28
29
- データ形式ごとにローダークラスが用意されています。ただ、ローダークラスは、Three.jsライブラリの本体に含まれていないので注意が必要です。公式GitHubの ` examples/js/loader ` フォルダーにJavaScriptファイルがあるので、これを ` script ` 要素で読み込みます。作業用フォルダーにローダー関連のファイルをコピーしておきましょう 。
29
+ データ形式ごとにローダークラスが用意されています。ただ、ローダークラスは、Three.jsライブラリの本体に含まれていないので注意が必要です。ローダークラスは ` script ` タグ等で取り込む必要があります 。
30
30
31
31
32
32
33
33
34
+ ### GLTFファイルの場合
35
+
36
+
37
+ GLTF(ジーエルティーエフ)はインターネット向けの3Dファイル形式です。クロノスグループによって2017年に仕様として定められました。GLTFの中身はJSONファイルを中心として、そこから参照される画像やメッシュデータ等の関連ファイルで構成されています。
38
+
39
+
40
+ GLTFファイルのサンプルは[ クロノスグループのGitHub] ( https://github.com/KhronosGroup/glTF-Sample-Models ) から取得できます。
41
+
42
+ 今回は以下のファイルを利用します。ライセンスがPublic domain (CC0) のファイルです。
43
+
44
+ https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/ToyCar
45
+
46
+
47
+ ` gltf ` ファイルの場合を読み込むには` GLTFLoader.js ` ファイルが必要となります。
48
+
49
+ ``` html
50
+ <script src =" https://unpkg.com/three@0.147.0/examples/js/loaders/GLTFLoader.js" ></script >
51
+ ```
52
+
53
+ ※Three.js r148(2022年12月リリース)より` examples/js ` フォルダーでの提供はなくなりました。今後はES Modulesでの利用を推奨されますので、本記事もゆくゆく更新します。
54
+
55
+ 読み込む処理は次のように記載します。` THREE.GLTFLoader ` クラスのインスタンスから、` loadAsync() ` メソッドを利用します。
56
+ 引数にはファイルパスを指定します。読み込み完了後に3D空間への追加処理をするのがポイントです。GLTFファイルにはシーンの情報の他に、カメラやライトなどさまざまな情報が含まれます。そのため、シーンの情報だけ抜き出すようにしましょう。
57
+
58
+ ``` js
59
+ // 非同期処理で待機するのでasync function宣言とする
60
+ async function init () {
61
+ // ・・・省略
62
+
63
+ // GLTF形式のモデルデータを読み込む
64
+ const loader = new THREE.GLTFLoader ();
65
+ // GLTFファイルのパスを指定
66
+ const gltf = loader .loadAsync (' ./models/gltf/glTF/ToyCar.gltf' );
67
+ // 読み込み後に3D空間に追加
68
+ const model = gltf .scene ;
69
+ scene .add (model);
70
+
71
+ // ・・・省略
72
+ }
73
+ ```
74
+
75
+ このコードの実行結果は次のとなります。
76
+
77
+ ![ ] ( ../imgs/loader_glb.png )
78
+
79
+ - [ サンプルを再生する] ( https://ics-creative.github.io/tutorial-three/samples/loader_gltf.html )
80
+ - [ サンプルのソースコードを確認する] ( ../samples/loader_gltf.html )
81
+
82
+
83
+ GLTFには、バイナリ形式のGLBがあります。GLTFはテキストデータや関連ファイルがばらけているのに対して、GLBはGLTFを1ファイルにまとめた形式となっています。GLBファイルを読み込む場合も` GLTFLoader ` クラスを利用します。コードは先ほど紹介したものとほとんど同じです。
84
+
85
+ ``` js
86
+ // 非同期処理で待機するのでasync function宣言とする
87
+ async function init () {
88
+ // ・・・省略
89
+
90
+ // GLTF形式のモデルデータを読み込む
91
+ const loader = new THREE.GLTFLoader ();
92
+ // GLTFファイルのパスを指定
93
+ const objects = loader .loadAsync (' ./models/gltf/binary/ToyCar.glb' );
94
+ // 読み込み後に3D空間に追加
95
+ const model = objects .scene ;
96
+ scene .add (model);
97
+
98
+ // ・・・省略
99
+ }
100
+ ```
101
+
102
+
103
+ - [ サンプルを再生する] ( https://ics-creative.github.io/tutorial-three/samples/loader_glb.html )
104
+ - [ サンプルのソースコードを確認する] ( ../samples/loader_glb.html )
105
+
106
+
107
+
108
+ 昔のThree.jsに` loadAsync() ` メソッドは存在せず、` load() ` メソッドのみ提供されていました。ネット上の記事では、` load() ` メソッドで説明されているものが多いですが、` Promise ` による非同期処理が苦手でなければ` await ` ・` async ` を使って制御するといいでしょう。
109
+
110
+
34
111
### 3dsファイルの場合
35
112
36
113
3dsファイルの場合を読み込むには` TDSLoader.js ` ファイルが必要となります。CDNで読み込む場合は以下の` script ` タグをHTMLに記述します。
@@ -40,21 +117,27 @@ Three.jsでモデルデータを読み込むには、JavaScriptでThree.jsの初
40
117
```
41
118
※Three.js r148(2022年12月リリース)より` examples/js ` フォルダーでの提供はなくなりました。今後はES Modulesでの利用を推奨されますので、本記事もゆくゆく更新します。
42
119
43
- 読み込む処理は次のように記載します。` THREE.TDSLoader ` クラスのインスタンスから、` load ` メソッドを利用します。
44
- 第一引数にはファイルパスを指定し、第二引数に読み込み後のコールバック関数を指定します。コールバック関数内で3D空間への追加処理をするのがポイントです 。
120
+ 読み込む処理は次のように記載します。` THREE.TDSLoader ` クラスのインスタンスから、` loadAsync() ` メソッドを利用します。戻り値として ` Promise ` オブジェクトを返すので ` await ` ・ ` async ` で待機します 。
121
+ 引数にはファイルパスを指定します 。
45
122
46
123
なお、3dsファイルのテクスチャーのパスがずれないように、` setResourcePath ` メソッドを使って、明示的にテクスチャーが含まれるフォルダーのパスを指定します。
47
124
48
125
``` js
49
- // 3DS形式のモデルデータを読み込む
50
- const loader = new THREE.TDSLoader ();
51
- // テクスチャーのパスを指定
52
- loader .setResourcePath (' models/3ds/portalgun/textures/' );
53
- // 3dsファイルのパスを指定
54
- loader .load (' models/3ds/portalgun/portalgun.3ds' , (object ) => {
126
+ // 非同期処理で待機するのでasync function宣言とする
127
+ async function init () {
128
+ // ・・・省略
129
+
130
+ // 3DS形式のモデルデータを読み込む
131
+ const loader = new THREE.TDSLoader ();
132
+ // テクスチャーのパスを指定
133
+ loader .setResourcePath (' models/3ds/portalgun/textures/' );
134
+ // 3dsファイルのパスを指定
135
+ const object = loader .loadAsync (' models/3ds/portalgun/portalgun.3ds' );
55
136
// 読み込み後に3D空間に追加
56
137
scene .add (object);
57
- });
138
+
139
+ // ・・・省略
140
+ }
58
141
```
59
142
60
143
このコードの実行結果は次のとなります。
@@ -64,6 +147,9 @@ loader.load('models/3ds/portalgun/portalgun.3ds', (object) => {
64
147
- [ サンプルを再生する] ( https://ics-creative.github.io/tutorial-three/samples/loader_3ds.html )
65
148
- [ サンプルのソースコードを確認する] ( ../samples/loader_3ds.html )
66
149
150
+
151
+
152
+
67
153
### Colladaファイルの場合
68
154
69
155
Colladaファイル(拡張子は` .dae ` )の場合を読み込むには` ColladaLoader.js ` ファイルが必要となります。
@@ -74,18 +160,23 @@ Colladaファイル(拡張子は`.dae`)の場合を読み込むには`Collad
74
160
75
161
※Three.js r148(2022年12月リリース)より` examples/js ` フォルダーでの提供はなくなりました。今後はES Modulesでの利用を推奨されますので、本記事もゆくゆく更新します。
76
162
77
- 読み込む処理は次のように記載します。` THREE.ColladaLoader ` クラスのインスタンスから、` load ` メソッドを利用します。
78
- 第一引数にはファイルパスを指定し、第二引数に読み込み後のコールバック関数を指定します。コールバック関数内で3D空間への追加処理をするのがポイントです 。Colladaファイルにはシーンの情報の他に、カメラやライトなどさまざまな情報が含まれます。そのため、コールバック関数の引数から 、シーンの情報だけ抜き出すようにしましょう。
163
+ 読み込む処理は次のように記載します。` THREE.ColladaLoader ` クラスのインスタンスから、` loadAsync() ` メソッドを利用します。
164
+ 引数にはファイルパスを指定します。読み込み完了後に3D空間への配置処理をするのがポイントです 。Colladaファイルにはシーンの情報の他に、カメラやライトなどさまざまな情報が含まれます。そのため、シーンの情報だけ抜き出すようにしましょう。
79
165
80
166
``` js
81
- // Collada形式のモデルデータを読み込む
82
- const loader = new THREE.ColladaLoader ();
83
- // Colladaファイルのパスを指定
84
- loader .load (' ./models/collada/elf/elf.dae' , (collada ) => {
167
+ // 非同期処理で待機するのでasync function宣言とする
168
+ async function init () {
169
+ // ・・・省略
170
+
171
+ // Collada形式のモデルデータを読み込む
172
+ const loader = new THREE.ColladaLoader ();
173
+ // Colladaファイルのパスを指定
174
+ const collada = await loader .loadAsync (' ./models/collada/elf/elf.dae' );
85
175
// 読み込み後に3D空間に追加
86
176
const model = collada .scene ;
87
177
scene .add (model);
88
- });
178
+ // ・・・省略
179
+ }
89
180
```
90
181
91
182
このコードの実行結果は次のとなります。
@@ -95,36 +186,6 @@ loader.load('./models/collada/elf/elf.dae', (collada) => {
95
186
- [ サンプルを再生する] ( https://ics-creative.github.io/tutorial-three/samples/loader_dae.html )
96
187
- [ サンプルのソースコードを確認する] ( ../samples/loader_dae.html )
97
188
98
- ### GLTFファイルの場合
99
-
100
- ` gltf ` ファイルの場合を読み込むには` GLTFLoader.js ` ファイルが必要となります。
101
-
102
- ``` html
103
- <script src =" https://unpkg.com/three@0.147.0/examples/js/loaders/GLTFLoader.js" ></script >
104
- ```
105
-
106
- ※Three.js r148(2022年12月リリース)より` examples/js ` フォルダーでの提供はなくなりました。今後はES Modulesでの利用を推奨されますので、本記事もゆくゆく更新します。
107
-
108
- 読み込む処理は次のように記載します。` THREE.GLTFLoader ` クラスのインスタンスから、` load ` メソッドを利用します。
109
- 第一引数にはファイルパスを指定し、第二引数に読み込み後のコールバック関数を指定します。コールバック関数内で3D空間への追加処理をするのがポイントです。Colladaファイルにはシーンの情報の他に、カメラやライトなどさまざまな情報が含まれます。そのため、コールバック関数の引数から、シーンの情報だけ抜き出すようにしましょう。
110
-
111
- ``` js
112
- // GLTF形式のモデルデータを読み込む
113
- const loader = new THREE.GLTFLoader ();
114
- // GLTFファイルのパスを指定
115
- loader .load (' ./models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf' , (gltf ) => {
116
- // 読み込み後に3D空間に追加
117
- const model = gltf .scene ;
118
- scene .add (model);
119
- });
120
- ```
121
-
122
- このコードの実行結果は次のとなります。
123
-
124
- ![ ] ( ../imgs/loader_gltf.png )
125
-
126
- - [ サンプルを再生する] ( https://ics-creative.github.io/tutorial-three/samples/loader_gltf.html )
127
- - [ サンプルのソースコードを確認する] ( ../samples/loader_gltf.html )
128
189
129
190
### まとめ
130
191
0 commit comments