Skip to content

Commit ea4a6b3

Browse files
committed
fix three-load-obj.md to use OBJLoader because three.js is removing OBJLoader2
1 parent 966aa5a commit ea4a6b3

18 files changed

+209
-161
lines changed

build/templates/warning.template

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div class="warning">{{{msg}}}</div>

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
},
99
"dependencies": {},
1010
"devDependencies": {
11-
"@gfxfundamentals/lesson-builder": "git+https://github.com/gfxfundamentals/lesson-builder.git#v1.9.0",
11+
"@gfxfundamentals/lesson-builder": "git+https://github.com/gfxfundamentals/lesson-builder.git#v1.10.0",
1212
"@gfxfundamentals/live-editor": "git+https://github.com/gfxfundamentals/live-editor.git#v1.0.17",
1313
"eslint-plugin-google-camelcase": "0.0.2",
1414
"eslint-plugin-html": "6.1.1",

threejs/lessons/ja/threejs-load-gltf.md

+7-6
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,11 @@ OBJとは異なり、gLTFではマテリアルはフォーマットの直接的
6666
以前のOBJコードは
6767

6868
```js
69-
const objLoader = new OBJLoader2();
70-
objLoader.loadMtl('resources/models/windmill/windmill-fixed.mtl', null, (materials) => {
71-
materials.Material.side = THREE.DoubleSide;
72-
objLoader.setMaterials(materials);
69+
const mtlLoader = new MTLLoader();
70+
mtlLoader.loadMtl('resources/models/windmill/windmill-fixed.mtl', (mtl) => {
71+
mtl.preload();
72+
mtl.materials.Material.side = THREE.DoubleSide;
73+
objLoader.setMaterials(mtl);
7374
objLoader.load('resources/models/windmill/windmill.obj', (event) => {
7475
const root = event.detail.loaderRootNode;
7576
scene.add(root);
@@ -93,11 +94,11 @@ objLoader.loadMtl('resources/models/windmill/windmill-fixed.mtl', null, (materia
9394
9495
自動フレーミングのコードは以前のままです。
9596
96-
また `OBJLoader2` を取り除き `GLTFLoader` を含める必要があります。
97+
また `OBJLoader` を取り除き `GLTFLoader` を含める必要があります。
9798
9899
```html
99100
-import {LoaderSupport} from './resources/threejs/r122/examples/jsm/loaders/LoaderSupport.js';
100-
-import {OBJLoader2} from './resources/threejs/r122/examples/jsm/loaders/OBJLoader2.js';
101+
-import {OBJLoader} from './resources/threejs/r122/examples/jsm/loaders/OBJLoader.js';
101102
-import {MTLLoader} from './resources/threejs/r122/examples/jsm/loaders/MTLLoader.js';
102103
+import {GLTFLoader} from './resources/threejs/r122/examples/jsm/loaders/GLTFLoader.js';
103104
```

threejs/lessons/ja/threejs-load-obj.md

+35-28
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ blendファイルをダウンロードし[Blender](https://blender.org)で読み
2929
[ライティングの記事](threejs-lights.html) にあるディレクショナルライティングの例から始めて、半球ライティングの例と組み合わせて `HemisphereLight``DirectionalLight` を1つ作る事にしました。その結果として `HemisphereLight` は1つ、`DirectionalLight` は1つになりました。
3030
また、ライトの調整に関連する全てのGUIを削除しました。シーンに追加していたキューブとスフィアも削除しました。
3131

32-
まず最初に `OBJLoader2` のローダーをコードに含める必要があります。
32+
まず最初に `OBJLoader` のローダーをコードに含める必要があります。
3333

3434
```js
35-
import {OBJLoader2} from './resources/threejs/r122/examples/jsm/loaders/OBJLoader2.js';
35+
import {OBJLoader} from './resources/threejs/r122/examples/jsm/loaders/OBJLoader.js';
3636
```
3737

38-
次にOBJファイルをロードするために `OBJLoader2` のインスタンスを作成し、OBJファイルのURLを渡し、ロードされたモデルをシーンに追加するコールバックを渡します。
38+
次にOBJファイルをロードするために `OBJLoader` のインスタンスを作成し、OBJファイルのURLを渡し、ロードされたモデルをシーンに追加するコールバックを渡します。
3939

4040
```js
4141
{
42-
const objLoader = new OBJLoader2();
42+
const objLoader = new OBJLoader();
4343
objLoader.load('resources/models/windmill/windmill.obj', (root) => {
4444
scene.add(root);
4545
});
@@ -115,25 +115,24 @@ blenderで **File->External Data->Unpack All Into Files** を選択し、これ
115115
<div class="threejs_center"><img style="width: 757px;" src="resources/images/windmill-exported-files-with-textures.png"></div>
116116

117117
テクスチャを利用できるようになったのでMTLファイルをロードします。
118-
`MTLLoader` `MtlObjBridge` をimportする必要があります。
118+
`MTLLoader` をimportする必要があります。
119119

120120
```js
121121
import * as THREE from './resources/three/r122/build/three.module.js';
122122
import {OrbitControls} from './resources/threejs/r122/examples/jsm/controls/OrbitControls.js';
123-
import {OBJLoader2} from './resources/threejs/r122/examples/jsm/loaders/OBJLoader2.js';
123+
import {OBJLoader} from './resources/threejs/r122/examples/jsm/loaders/OBJLoader.js';
124124
+import {MTLLoader} from './resources/threejs/r122/examples/jsm/loaders/MTLLoader.js';
125-
+import {MtlObjBridge} from './resources/threejs/r122/examples/jsm/loaders/obj2/bridge/MtlObjBridge.js';
126125
```
127126

128127
まず、MTLファイルをロードします。
129-
読込後にロードしたマテリアルを `MtlObjBridge` を通して `OBJLoader2` をロードしOBJファイルをロードします
128+
読込後にロードしたマテリアルを `OBJLoader`に設定して、`OBJLoader` でOBJファイルをロードします
130129

131130
```js
132131
{
133132
+ const mtlLoader = new MTLLoader();
134-
+ mtlLoader.load('resources/models/windmill/windmill.mtl', (mtlParseResult) => {
135-
+ const materials = MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult);
136-
+ objLoader.addMaterials(materials);
133+
+ mtlLoader.load('resources/models/windmill/windmill.mtl', (mtl) => {
134+
+ mtl.preload();
135+
+ objLoader.setMaterials(mtl);
137136
objLoader.load('resources/models/windmill/windmill.obj', (root) => {
138137
scene.add(root);
139138
});
@@ -156,9 +155,9 @@ MTLファイルを簡単に修正する方法はありません。
156155
1. マテリアルの読込後、全てのマテリアルをループさせて両面を適用する
157156

158157
const mtlLoader = new MTLLoader();
159-
mtlLoader.load('resources/models/windmill/windmill.mtl', (mtlParseResult) => {
160-
const materials = MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult);
161-
for (const material of Object.values(materials)) {
158+
mtlLoader.load('resources/models/windmill/windmill.mtl', (mtl) => {
159+
mtl.preload()
160+
for (const material of Object.values(mtl.materials)) {
162161
material.side = THREE.DoubleSide;
163162
}
164163
...
@@ -172,18 +171,26 @@ MTLファイルを簡単に修正する方法はありません。
172171
試行錯誤の結果、風車の羽根は `"Material"` というマテリアル名を使う事が分かりました。
173172

174173
const mtlLoader = new MTLLoader();
175-
mtlLoader.load('resources/models/windmill/windmill.mtl', (mtlParseResult) => {
176-
const materials = MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult);
177-
materials.Material.side = THREE.DoubleSide;
174+
mtlLoader.load('resources/models/windmill/windmill.mtl', (mtl) => {
175+
mtl.perload();
176+
mtl.materials.Material.side = THREE.DoubleSide;
178177
...
179178

180179
3. MTLファイルには制限がある事に気付き、MTLファイルを使わず自前でマテリアルを作成する
181180

182-
const materials = {
183-
Material: new THREE.MeshPhongMaterial({...}),
184-
windmill: new THREE.MeshPhongMaterial({...}),
185-
};
186-
objLoader.setMaterials(materials);
181+
objLoader.load('resources/models/windmill/windmill.obj', (root) => {
182+
const materials = {
183+
Material: new THREE.MeshPhongMaterial({...}),
184+
windmill: new THREE.MeshPhongMaterial({...}),
185+
};
186+
root.traverse(node => {
187+
const material = materials[node.material?.name];
188+
if (material) {
189+
node.material = material;
190+
}
191+
})
192+
scene.add(root);
193+
});
187194

188195
どれを選ぶかはあなた次第です。
189196
1が1番簡単です。3が最も柔軟です。2はその中間で今回は2を選びます。
@@ -354,7 +361,7 @@ function frameArea(sizeToFitOnScreen, boxSize, boxCenter, camera) {
354361
355362
```js
356363
{
357-
const objLoader = new OBJLoader2();
364+
const objLoader = new OBJLoader();
358365
objLoader.load('resources/models/windmill_2/windmill.obj', (root) => {
359366
scene.add(root);
360367
+ // compute the box that contains all the stuff
@@ -511,15 +518,15 @@ illum 2
511518
```
512519
513520
MTLファイルが適度なサイズのテクスチャを指しているので、それをロードする必要があります。
514-
上記で行ったようにまずマテリアルをロードしてから `OBJLoader2` に設定します。
521+
上記で行ったようにまずマテリアルをロードしてから `OBJLoader` に設定します。
515522
516523
```js
517524
{
518525
+ const mtlLoader = new MTLLoader();
519-
+ mtlLoader.load('resources/models/windmill_2/windmill-fixed.mtl', (mtlParseResult) => {
520-
+ const objLoader = new OBJLoader2();
521-
+ const materials = MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult);
522-
+ objLoader.addMaterials(materials);
526+
+ mtlLoader.load('resources/models/windmill_2/windmill-fixed.mtl', (mtl) => {
527+
+ const objLoader = new OBJLoader();
528+
+ mtl.preload();
529+
+ objLoader.setMaterials(mtl);
523530
objLoader.load('resources/models/windmill/windmill.obj', (root) => {
524531
root.updateMatrixWorld();
525532
scene.add(root);

threejs/lessons/kr/threejs-load-gltf.md

+7-6
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,11 @@ glTF는 특정 목적으로 고안되었기에 대부분의 경우 glTF 파일
7171
아래의 기존 코드를
7272

7373
```js
74-
const objLoader = new OBJLoader2();
75-
objLoader.loadMtl('resources/models/windmill/windmill-fixed.mtl', null, (materials) => {
76-
materials.Material.side = THREE.DoubleSide;
77-
objLoader.setMaterials(materials);
74+
const mtlLoader = new MTLLoader();
75+
mtlLoader.loadMtl('resources/models/windmill/windmill-fixed.mtl', (mtl) => {
76+
mtl.preload();
77+
mtl.materials.Material.side = THREE.DoubleSide;
78+
objLoader.setMaterials(mtl);
7879
objLoader.load('resources/models/windmill/windmill.obj', (event) => {
7980
const root = event.detail.loaderRootNode;
8081
scene.add(root);
@@ -98,12 +99,12 @@ objLoader.loadMtl('resources/models/windmill/windmill-fixed.mtl', null, (materia
9899
99100
자동으로 카메라의 시야를 조정하는 코드는 그대로 두었습니다.
100101
101-
모듈이 바뀌었으니 import 문도 변경해야 합니다. `OBJLoader2`를 제거하고 `GLTFLoader`
102+
모듈이 바뀌었으니 import 문도 변경해야 합니다. `OBJLoader`를 제거하고 `GLTFLoader`
102103
추가합니다.
103104
104105
```html
105106
-import { LoaderSupport } from './resources/threejs/r122/examples/jsm/loaders/LoaderSupport.js';
106-
-import { OBJLoader2 } from './resources/threejs/r122/examples/jsm/loaders/OBJLoader2.js';
107+
-import { OBJLoader } from './resources/threejs/r122/examples/jsm/loaders/OBJLoader.js';
107108
-import { MTLLoader } from './resources/threejs/r122/examples/jsm/loaders/MTLLoader.js';
108109
+import { GLTFLoader } from './resources/threejs/r122/examples/jsm/loaders/GLTFLoader.js';
109110
```

threejs/lessons/kr/threejs-load-obj.md

+37-28
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,19 @@ Three.js로 프로젝트를 진행할 때, 3D 모델 파일을 불러와 사용
3838
하나, `DirectionalLight` 하나가 있는 셈입니다. 또 GUI 관련 코드와 정육면체,
3939
구체 관련 코드도 지웁니다.
4040

41-
다음으로 먼저 `OBJLoader2` 모듈을 스크립트에 로드합니다.
41+
다음으로 먼저 `OBJLoader` 모듈을 스크립트에 로드합니다.
4242

4343
```js
44-
import { OBJLoader2 } from './resources/threejs/r122/examples/jsm/loaders/OBJLoader2.js';
44+
import { OBJLoader } from './resources/threejs/r122/examples/jsm/loaders/OBJLoader.js';
4545
```
4646

47-
`OBJLoader2`의 인스턴스를 생성한 뒤 .OBJ 파일의 경로와 콜백 함수를 넘겨
47+
`OBJLoader`의 인스턴스를 생성한 뒤 .OBJ 파일의 경로와 콜백 함수를 넘겨
4848
`load` 메서드를 실행합니다. 그리고 콜백 함수에서 불러온 모델을 장면에
4949
추가합니다.
5050

5151
```js
5252
{
53-
const objLoader = new OBJLoader2();
53+
const objLoader = new OBJLoader();
5454
objLoader.load('resources/models/windmill/windmill.obj', (root) => {
5555
scene.add(root);
5656
});
@@ -130,25 +130,26 @@ map_Ns windmill_001_base_SPEC.jpg
130130

131131
이제 .MTL 파일에서 사용할 텍스처를 생성했으니 .MTL 파일을 불러오도록 합시다.
132132

133-
`MTLLoader``MTLObjBridge` 모듈을 불러옵니다.
133+
`MTLLoader` 모듈을 불러옵니다.
134134

135135
```js
136136
import * as THREE from './resources/three/r122/build/three.module.js';
137137
import { OrbitControls } from './resources/threejs/r122/examples/jsm/controls/OrbitControls.js';
138-
import { OBJLoader2 } from './resources/threejs/r122/examples/jsm/loaders/OBJLoader2.js';
138+
import { OBJLoader } from './resources/threejs/r122/examples/jsm/loaders/OBJLoader.js';
139139
+import { MTLLoader } from './resources/threejs/r122/examples/jsm/loaders/MTLLoader.js';
140-
+import { MtlObjBridge } from './resources/threejs/r122/examples/jsm/loaders/obj2/bridge/MtlObjBridge.js';
141140
```
142141

143-
우선 .MTL 파일을 불러와 `MtlObjBridge`로 재질을 만듭니다. 그리고 `OBJLoader2`
142+
{{{warning msgId="badTranslation"}}}
143+
144+
우선 .MTL 파일을 불러와 `MtlObjBridge`로 재질을 만듭니다. 그리고 `OBJLoader`
144145
인스턴스에 방금 만든 재질을 추가한 뒤 .OBJ 파일을 불러옵니다.
145146

146147
```js
147148
{
148149
+ const mtlLoader = new MTLLoader();
149-
+ mtlLoader.load('resources/models/windmill/windmill.mtl', (mtlParseResult) => {
150-
+ const materials = MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult);
151-
+ objLoader.addMaterials(materials);
150+
+ mtlLoader.load('resources/models/windmill/windmill.mtl', (mtl) => {
151+
+ mtl.preload();
152+
+ objLoader.setMaterials(mtl);
152153
objLoader.load('resources/models/windmill/windmill.obj', (root) => {
153154
scene.add(root);
154155
});
@@ -171,9 +172,9 @@ import { OBJLoader2 } from './resources/threejs/r122/examples/jsm/loaders/OBJLoa
171172
1. 모든 재질을 불러온 뒤 반복문으로 처리한다.
172173

173174
const mtlLoader = new MTLLoader();
174-
mtlLoader.load('resources/models/windmill/windmill.mtl', (mtlParseResult) => {
175-
const materials = MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult);
176-
for (const material of Object.values(materials)) {
175+
mtlLoader.load('resources/models/windmill/windmill.mtl', (mtl) => {
176+
mtl.preload();
177+
for (const material of Object.values(mtl.materials)) {
177178
material.side = THREE.DoubleSide;
178179
}
179180
...
@@ -188,18 +189,26 @@ import { OBJLoader2 } from './resources/threejs/r122/examples/jsm/loaders/OBJLoa
188189
양면 속성을 설정할 수도 있을 겁니다.
189190

190191
const mtlLoader = new MTLLoader();
191-
mtlLoader.load('resources/models/windmill/windmill.mtl', (mtlParseResult) => {
192-
const materials = MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult);
193-
materials.Material.side = THREE.DoubleSide;
192+
mtlLoader.load('resources/models/windmill/windmill.mtl', (mtl) => {
193+
mtl.preload();
194+
mtl.materials.Material.side = THREE.DoubleSide;
194195
...
195196

196197
3. .MTL 파일의 한계에 굴복하고 직접 재질을 만든다.
197198

198-
const materials = {
199-
Material: new THREE.MeshPhongMaterial({...}),
200-
windmill: new THREE.MeshPhongMaterial({...}),
201-
};
202-
objLoader.setMaterials(materials);
199+
objLoader.load('resources/models/windmill/windmill.obj', (root) => {
200+
const materials = {
201+
Material: new THREE.MeshPhongMaterial({...}),
202+
windmill: new THREE.MeshPhongMaterial({...}),
203+
};
204+
root.traverse(node => {
205+
const material = materials[node.material?.name];
206+
if (material) {
207+
node.material = material;
208+
}
209+
})
210+
scene.add(root);
211+
});
203212

204213
뭘 선택하든 그건 여러분의 선택입니다. 1번이 가장 간단하고, 3번이 가장
205214
확장성이 좋죠. 2번은 그 중간입니다. 지금은 2번 해결책을 사용하도록 하죠.
@@ -375,7 +384,7 @@ function frameArea(sizeToFitOnScreen, boxSize, boxCenter, camera) {
375384
376385
```js
377386
{
378-
const objLoader = new OBJLoader2();
387+
const objLoader = new OBJLoader();
379388
objLoader.load('resources/models/windmill_2/windmill.obj', (root) => {
380389
scene.add(root);
381390
+ // 모든 요소를 포함하는 육면체를 계산합니다
@@ -524,15 +533,15 @@ illum 2
524533
```
525534
526535
텍스처의 용량을 최적화했으니 이제 불러올 일만 남았습니다. 먼저 아까 했던 것처럼
527-
재질을 불러와 `OBJLoader2`에 지정합니다.
536+
재질을 불러와 `OBJLoader`에 지정합니다.
528537
529538
```js
530539
{
531540
+ const mtlLoader = new MTLLoader();
532-
+ mtlLoader.load('resources/models/windmill_2/windmill-fixed.mtl', (mtlParseResult) => {
533-
+ const objLoader = new OBJLoader2();
534-
+ const materials = MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult);
535-
+ objLoader.addMaterials(materials);
541+
+ mtlLoader.load('resources/models/windmill_2/windmill-fixed.mtl', (mtl) => {
542+
+ mtl.preload();
543+
+ const objLoader = new OBJLoader();
544+
+ objLoader.setMaterials(mtl);
536545
objLoader.load('resources/models/windmill/windmill.obj', (root) => {
537546
root.updateMatrixWorld();
538547
scene.add(root);

threejs/lessons/langinfo.hanson

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
[Here's the original English article for now]({{{origLink}}}).
2525
`,
2626
contribTemplate: 'Thank you <a href="${html_url}"><img src="${avatar_url}"> ${login}</a><br>for <a href="https://github.com/${owner}/${repo}/commits?author=${login}">${contributions} contributions</a>',
27+
translations: {
28+
badTranslation: 'Sorry, the translation of this area is out of date. <a href="{{packageJSON.homepage}}/blob/master/{{contentFileName}}">Please consider helping to fix it</a>.',
29+
updateNeeded: 'The translation of this article is out of date. <a href="{{packageJSON.homepage}}/blob/master/{{contentFileName}}">Please consider helping to fix it</a>.',
30+
},
2731
toc: 'Table of Contents',
2832
categoryMapping: {
2933
'basics': 'Basics',

threejs/lessons/resources/lesson.css

+8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ table {
1818
margin-bottom: 1em;
1919
}
2020

21+
.warning {
22+
padding: 1em;
23+
background: red;
24+
}
25+
2126
.footnote {
2227
font-size: smaller;
2328
vertical-align: baseline;
@@ -545,6 +550,9 @@ pre.prettyprint.lighttheme .fun { color: #900; } /* function name */
545550
a {
546551
color: #56d3fd;
547552
}
553+
.warning {
554+
background: darkred;
555+
}
548556
pre.prettyprint, code.prettyprint, .dos {
549557
box-shadow: 10px 10px 0px #292929;
550558
}

0 commit comments

Comments
 (0)