Skip to content

Commit 117c9a4

Browse files
committed
2 parents ca4772d + 18bc950 commit 117c9a4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+290
-31
lines changed

docs/camera_variation.md

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ const camera = new THREE.OrthographicCamera(-480, +480, 270, -270, 1, 1000);
6262

6363
サンプルのように規則正しく3Dオブジェクトを配置すると、平行投影のゲームのような表現が得られます。
6464

65+
![](../imgs/camera_orthographic_1.png)
6566

6667
## 共通の設定:クリッピング
6768

docs/fog.md

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Three.jsのフォグ機能
2+
3+
4+
フォグ効果とは遠くのものが霧がかって霞んで見えるような状態にする効果のことです。フォグ(Fog)は日本語で「霧, 濃霧」という意味です。
5+
6+
Three.jsではカメラからの開始距離と終点距離を設定することで、その間に存在するオブジェクトが指定した色によって霞んで表示されます。
7+
8+
9+
## フォグのサンプル
10+
11+
12+
![](../imgs/fog.png)
13+
14+
- [サンプルを再生する](https://ics-creative.github.io/tutorial-three/samples/fog.html)
15+
- [サンプルのソースコードを確認する](../samples/fog.html)
16+
17+
このサンプルでは1000個の立方体をランダムに配置。カメラから遠いオブジェクトほど暗く表示されています。これは照明効果ではなく、フォグの機能で暗くなっています。
18+
19+
20+
フォグを設定していない場合の見え方と比較すると、この効果がわかりやすいでしょう。カメラから遠い場所に注目ください。
21+
22+
![](../imgs/fog_off.png)
23+
24+
▲フォグを設定していない場合の見え方
25+
26+
27+
## フォグの設定方法
28+
29+
フォグを設定するには`THREE.Scene`オブジェクトの`fog`プロパティーに、`THREE.Fog`インスタンスを代入します。
30+
31+
```js
32+
// シーンを作成
33+
const scene = new THREE.Scene();
34+
35+
// フォグを設定
36+
// new THREE.Fog(色, 開始距離, 終点距離);
37+
scene.fog = new THREE.Fog(0x000000, 50, 2000);
38+
```
39+
40+
41+
42+
わずか一行のコードを加えるだけで空間の奥行きを表現できるので、手軽に試すことのできる機能です。
43+
44+
<article-author>[池田 泰延](https://twitter.com/clockmaker)</article-author>
45+
<article-date-published>2017-11-16</article-date-published>
46+
<article-date-modified>2017-11-16</article-date-modified>

docs/index.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ WebGLだけで3D表現をするためには、立方体一つ表示するだけ
2727
- [ジオメトリ](geometry_general.md)
2828
- [カメラの制御方法(座標制御)](camera_position.md)
2929
- [カメラの制御方法(OrbitControls)](camera_orbitcontrols.md)
30-
- [モデルデータの読み込み](model_basic.md)
30+
3131

3232
## Three.js 基本編
3333

@@ -41,10 +41,13 @@ Three.jsには多彩な機能が存在します。機能を習得すればする
4141
- [様々なライト](light_variation.md)
4242
- [影を落とす方法](light_shadowmap.md)
4343
- [様々なカメラ](camera_variation.md)
44+
- [フォグ](fog.md)
4445
- [スプライト/ビルボード](sprite.md)
4546
- [グループ化](object3d_group.md)
4647
- [ワールド座標](position_world.md)
4748
- [スクリーン座標](position_project.md)
49+
- [モデルデータの読み込み](model_basic.md)
50+
- [canvasのリサイズ処理](renderer_resize.md)
4851

4952
## Three.js 中級編
5053

@@ -125,4 +128,4 @@ WebGLの最適化や次世代の仕様について理解を深めましょう。
125128

126129
<article-author>[池田 泰延](https://twitter.com/clockmaker)</article-author>
127130
<article-date-published>2017-11-02</article-date-published>
128-
<article-date-modified>2017-11-12</article-date-modified>
131+
<article-date-modified>2017-11-16</article-date-modified>

docs/renderer_resize.md

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Three.jsでの最適なリサイズ処理
2+
3+
Three.jsでの最適なリサイズ処理の方法を紹介します。この手順を覚えれば次のような希望に対応できます。
4+
5+
- どんなディスプレイでもThree.jsを綺麗に見せたい
6+
- 異なるディスプレイでも全画面に3Dを表示させたい
7+
- ブラウザのサイズを変更してもThree.jsを全画面にフィットさせたい
8+
9+
## リサイズのサンプル
10+
11+
- [サンプルを再生する](https://ics-creative.github.io/tutorial-three/samples/renderer_resize.html)
12+
- [サンプルのソースコードを確認する](../samples/renderer_resize.html)
13+
14+
15+
![](../imgs/renderer_resize_1.png)
16+
17+
![](../imgs/renderer_resize_2.png)
18+
19+
![](../imgs/renderer_resize_3.png)
20+
21+
22+
## 設定方法
23+
24+
### HTMLのメタタグ
25+
26+
HTMLの`meta`タグに`viewport`の設定をします。
27+
28+
```html
29+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
30+
```
31+
32+
スマートフォンのブラウザには横幅の大きなPCサイトも柔軟に見れるように自動的に拡大縮小する機能があります。WebGLを綺麗に見せたいときには、その機能が余計な処お世話となります。
33+
34+
`width=device-width`と指定することでデバイスの最適な幅で表示させるようにします。また、初期状態で拡大・縮小していない見え方にするために`initial-scale=1`を指定します。
35+
36+
### スタイルシート
37+
38+
`body`タグに余白が存在するので、それを消すように`margin: 0`を指定します。
39+
40+
```html
41+
<style>
42+
body {
43+
margin: 0;
44+
overflow: hidden;
45+
}
46+
</style>
47+
```
48+
49+
また、`overflow: hidden`を指定すると、macOSのデスクトップブラウザのオーバースクロール(例えば画面上部にスクロールすると、画面上部を一瞬超えて表示される挙動)を抑制できます。全画面コンテンツを作るときにオーバースクロールの挙動は余計なお世話なので、`overflow: hidden`を指定しておきましょう。
50+
51+
### Three.jsの調整
52+
53+
`resize`イベントを監視し、画面サイズである`window.innerWidth``window.innerHeight`の値を使います。
54+
55+
```js
56+
// 初期化のために実行
57+
onResize();
58+
// リサイズイベント発生時に実行
59+
window.addEventListener('resize', onResize);
60+
61+
function onResize() {
62+
// サイズを取得
63+
const width = window.innerWidth;
64+
const height = window.innerHeight;
65+
66+
// レンダラーのサイズを調整する
67+
renderer.setPixelRatio(window.devicePixelRatio);
68+
renderer.setSize(width, height);
69+
70+
// カメラのアスペクト比を正す
71+
camera.aspect = width / height;
72+
camera.updateProjectionMatrix();
73+
}
74+
```
75+
76+
実装のポイントは次の通りです。
77+
78+
- リサイズ時にはレンダラーのサイズを`setSize`メソッドで画面幅に合わせること
79+
- デスクトップでは、メインディスプレイ・サブディスプレイでPixelRatioが異なる可能性があるので、リサイズイベントで`setPixelRatio`メソッドで更新するべき
80+
- リサイズ時にはカメラの縦横比が狂うので、リサイズ時に縦横比を正しく調整する
81+
- 画面サイズの設定処理は、初期化時もリサイズ時も同じ
82+
- `onResize`関数は初期化時とリサイズイベント発生の両方で呼び出す
83+
84+
85+
以上となります。詳しくはサンプルのコードをコピーするなどして取り組んでください。
86+
87+
<article-author>[池田 泰延](https://twitter.com/clockmaker)</article-author>
88+
<article-date-published>2017-11-16</article-date-published>
89+
<article-date-modified>2017-11-16</article-date-modified>

html/imgs/summary_large_image.png

5.37 KB
Loading

html/imgs/summary_large_image.psd

11.8 KB
Binary file not shown.

imgs/camera_orthographic.png

230 KB
Loading

imgs/camera_orthographic_1.png

514 KB
Loading

imgs/fog.png

145 KB
Loading

imgs/fog_off.png

81.8 KB
Loading

imgs/renderer_resize_1.png

304 KB
Loading

imgs/renderer_resize_2.png

36.1 KB
Loading

imgs/renderer_resize_3.png

837 KB
Loading

samples/camera_basic.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!DOCTYPE html>
1+
22
<html>
33
<head>
44
<meta charset="utf-8"/>

samples/camera_basic_earth.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/camera_mosue_drag.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/camera_mouse_x.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/camera_orbitcontrols.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/camera_orbitcontrols_basic.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/camera_orthographic.html

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>
@@ -59,7 +58,11 @@
5958
// マス目を作成
6059
{
6160
// 立方体のマテリアルとジオメトリを作成
62-
const material = new THREE.MeshStandardMaterial({color: 0x22DD22, roughness: 0.1, metalness: 0.2});
61+
const material = new THREE.MeshStandardMaterial({
62+
color: 0x2299FF,
63+
roughness: 0.1,
64+
metalness: 0.2
65+
});
6366
const geometry = new THREE.BoxGeometry(45, 45, 45);
6467

6568
// 立方体を複数作成しランダムに配置

samples/fog.html

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<html>
2+
<head>
3+
<meta charset="utf-8"/>
4+
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/88/three.min.js"></script>
5+
<script>
6+
// ページの読み込みを待つ
7+
window.addEventListener('load', init);
8+
9+
function init() {
10+
// サイズを指定
11+
const width = 960;
12+
const height = 540;
13+
14+
// レンダラーを作成
15+
const renderer = new THREE.WebGLRenderer({
16+
canvas: document.querySelector('#myCanvas'),
17+
antialias: true,
18+
devicePixelRatio: window.devicePixelRatio,
19+
});
20+
renderer.setSize(width, height);
21+
22+
// シーンを作成
23+
const scene = new THREE.Scene();
24+
25+
// フォグを設定
26+
scene.fog = new THREE.Fog(0x000000, 50, 2000);
27+
28+
// カメラを作成
29+
const camera = new THREE.PerspectiveCamera(45, width / height);
30+
camera.position.set(0, 0, +1000);
31+
32+
// グループを作成
33+
const group = new THREE.Group();
34+
scene.add(group);
35+
const geometry = new THREE.BoxBufferGeometry(50, 50, 50);
36+
const material = new THREE.MeshStandardMaterial();
37+
38+
for (let i = 0; i < 1000; i++) {
39+
const mesh = new THREE.Mesh(geometry, material);
40+
mesh.position.x = (Math.random() - 0.5) * 2000;
41+
mesh.position.y = (Math.random() - 0.5) * 2000;
42+
mesh.position.z = (Math.random() - 0.5) * 2000;
43+
mesh.rotation.x = Math.random() * 2 * Math.PI;
44+
mesh.rotation.y = Math.random() * 2 * Math.PI;
45+
mesh.rotation.z = Math.random() * 2 * Math.PI;
46+
// グループに格納する
47+
group.add(mesh);
48+
}
49+
50+
// 光源
51+
scene.add(new THREE.DirectionalLight(0xFF0000, 2));// 平行光源
52+
scene.add(new THREE.AmbientLight(0x00FFFF));// 環境光源
53+
54+
// 毎フレーム時に実行されるループイベントです
55+
tick();
56+
57+
function tick() {
58+
// グループを回す
59+
group.rotateY(0.01);
60+
renderer.render(scene, camera);// レンダリング
61+
requestAnimationFrame(tick);
62+
}
63+
}
64+
</script>
65+
</head>
66+
<body>
67+
<canvas id="myCanvas"></canvas>
68+
</body>
69+
</html>

samples/geometry_general.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/geometry_merge.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/geometry_merge_mesh.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/geometry_merge_none.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/loader_3ds.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/loader_dae.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/material_color.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/material_texture.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/material_variation_basic.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/material_variation_lambert.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/material_variation_normal.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/material_variation_phong.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/material_variation_standard.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/material_variation_toon.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/points.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/quickstart.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

samples/raycast.html

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
<!DOCTYPE html>
21
<html>
32
<head>
43
<meta charset="utf-8"/>

0 commit comments

Comments
 (0)