2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Webデザイナーのためのthree.js入門

Last updated at Posted at 2025-05-26

はじめに:なぜ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やるべきなの?

やれ。

理由:

  1. 差別化できる
  2. 単価上がる
  3. なんかカッコいい
  4. 女子にモテる(要出典)

ただし:

  • 最初は泣く
  • バグで泣く
  • パフォーマンスで泣く
  • でも慣れたら楽しい

次のステップ

  1. 公式ドキュメント読め(英語だけど頑張れ)
  2. Three.js Journey(有料だけど神)
  3. シェーダー勉強しろ(沼)
  4. WebGPU対応に備えろ(未来)

追記1: 「数学いらない」は嘘です。でも高校数学レベルでなんとかなる。

追記2: React Three Fiberっていうのもあるけど、まず生Three.js覚えろ。話はそれからだ。

宣伝

それじゃ、また会おう。Three.jsの沼で。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?