🐈
Webデザイナーのためのthree.js入門
はじめに:なぜThree.jsから逃げるのか
「Webで3Dとか重いだけや!何もメリットない。やめろ。」って思ってたけど、
気づいたらThree.jsの沼にハマってた。
結論から言うと、Three.js覚えたら幸せになった。
これは楽しいぞ!
Three.jsって何なの?死ぬの?
Three.jsは簡単に言うと「ブラウザで3Dグリグリ動かせる魔法のライブラリ」。
WebGLっていうクッソ難しい技術を、まるでjQuery感覚で使えるようにした神ツールなんだわ。
// WebGL生書きだとこんな感じ(地獄)
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
// あと100行くらい続く...オワタ\(^o^)/
// Three.jsだとこれだけ
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
**は?これだけ?**って思うだろ?そうなんだよ、これだけなんだよ。
なぜWebデザイナーがThree.jsを覚えるべきなのか
1. 差別化できる(マジで)
「私、Photoshop使えます!」→ 誰でも使えるわwww
「私、Three.js使えます!」→ !?
この差よ。
2. 単価が違う
- 普通のLP制作:5〜30万
- Three.js使ったLP制作:30〜100万
倍率ドン!さらに倍!
3. 実は簡単(大嘘)
いや、嘘じゃないんだけど、最初はちょっとキツい。
でも数学アレルギーでも大丈夫。四則演算できれば何とかなる。
環境構築:npmとか知らんやつは泣きながら覚えろ
# まずnpmインストールしろ(してない奴は反省しろ)
npm init -y
npm install three
# もしくはCDNでズルする(初心者はこっち推奨)
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
Hello World的なやつ(立方体クルクル)
これがThree.js界の「Hello World」だ。コピペして動かせ。
// シーン作る(舞台みたいなもん)
const scene = new THREE.Scene();
// カメラ作る(お前の目玉)
const camera = new THREE.PerspectiveCamera(
75, // 視野角(広角レンズ的な)
window.innerWidth / window.innerHeight, // アスペクト比
0.1, // 近くの描画限界
1000 // 遠くの描画限界
);
// レンダラー作る(実際に描画するやつ)
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 立方体作る
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// カメラの位置(引いて全体見る)
camera.position.z = 5;
// アニメーション(無限ループ)
function animate() {
requestAnimationFrame(animate);
// 回転させる(これがないと死ぬほどつまらん)
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
おめでとう!これでお前も3Dエンジニアだ!(大嘘)
Three.jsの三種の神器
1. Scene(シーン)
舞台。ここに全部置く。何も置かないと真っ黒で泣く。
2. Camera(カメラ)
お前の視点。これがないと何も見えなくて泣く。
3. Renderer(レンダラー)
実際に描画する係。これがないと何も表示されなくて泣く。
よくある罠と対処法
罠1:真っ黒画面
// ライトを忘れてる(あるある)
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(0, 1, 1);
scene.add(light);
// もしくはMeshBasicMaterialを使え(ライト不要)
罠2:重すぎて死ぬ
// ポリゴン数減らせ
geometry = new THREE.SphereGeometry(5, 32, 32); // 細かすぎ
geometry = new THREE.SphereGeometry(5, 16, 16); // これでいい
罠3:数学アレルギー発症
// 三角関数とか使わなくても動く(最初は)
// gsapとか使えば数学知らなくてもアニメーション作れる
gsap.to(cube.rotation, {
x: Math.PI * 2,
duration: 2,
repeat: -1
});
実践:かっこいいエフェクト3選
1. パーティクルで宇宙っぽいやつ
const particlesGeometry = new THREE.BufferGeometry();
const count = 5000;
const positions = new Float32Array(count * 3);
for(let i = 0; i < count * 3; i++) {
positions[i] = (Math.random() - 0.5) * 10;
}
particlesGeometry.setAttribute('position',
new THREE.BufferAttribute(positions, 3)
);
const particlesMaterial = new THREE.PointsMaterial({
color: 0xffffff,
size: 0.1
});
const particles = new THREE.Points(particlesGeometry, particlesMaterial);
scene.add(particles);
これでお前のサイトも宇宙だ!
2. テキストを3Dで表示(フォント読み込み必須)
const loader = new THREE.FontLoader();
loader.load('fonts/helvetiker_regular.typeface.json', (font) => {
const geometry = new THREE.TextGeometry('キタ━━━(゚∀゚)━━━!!', {
font: font,
size: 1,
height: 0.2,
curveSegments: 12,
bevelEnabled: true,
bevelThickness: 0.03,
bevelSize: 0.02,
bevelOffset: 0,
bevelSegments: 5
});
const material = new THREE.MeshNormalMaterial();
const text = new THREE.Mesh(geometry, material);
scene.add(text);
});
3. グリッチエフェクト(バグった感じのやつ)
// ポストプロセシング使う(ちょっと上級)
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
import { GlitchPass } from 'three/examples/jsm/postprocessing/GlitchPass.js';
const composer = new EffectComposer(renderer);
composer.addPass(new RenderPass(scene, camera));
composer.addPass(new GlitchPass());
// animate内でrenderer.renderの代わりに
composer.render();
パフォーマンス最適化(重要)
1. dispose()を忘れるな
// メモリリークで死ぬ
geometry.dispose();
material.dispose();
texture.dispose();
2. レンダリング最適化
// 見えないものは描画しない
mesh.frustumCulled = true;
// LOD(遠いものは雑に描画)
const lod = new THREE.LOD();
lod.addLevel(highDetailMesh, 0);
lod.addLevel(lowDetailMesh, 50);
3. テクスチャサイズ
- 2の累乗にしろ(512x512、1024x1024とか)
- でかすぎるテクスチャは死
まとめ:結局Three.jsやるべきなの?
やれ。
理由:
- 差別化できる
- 単価上がる
- なんかカッコいい
- 女子にモテる(要出典)
ただし:
- 最初は泣く
- バグで泣く
- パフォーマンスで泣く
- でも慣れたら楽しい
次のステップ
- 公式ドキュメント読め(英語だけど頑張れ)
- Three.js Journey(有料だけど神)
- シェーダー勉強しろ(沼)
- WebGPU対応に備えろ(未来)
追記1: 「数学いらない」は嘘です。でも高校数学レベルでなんとかなる。
追記2: React Three Fiberっていうのもあるけど、まず生Three.js覚えろ。話はそれからだ。
宣伝
それじゃ、また会おう。Three.jsの沼で。
Discussion