「初心者向け:Three.jsで遊べる3Dピンボールを作ってみた」

記事
IT・テクノロジー
はじめに

今回は Three.js を使って、ブラウザ上で遊べる 3D ピンボールゲームを作りました。
ボールがフリッパーや障害物(バンパー)に当たって跳ね返る仕組みも実装しています。

フリッパー操作:左右の矢印キーで操作

ボール挙動:重力、跳ね返り、バンパー反射

障害物配置:三角形配置で自然な弾き方

実装のポイント
1. Three.jsの基本セットアップ
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(...);
const renderer = new THREE.WebGLRenderer({ canvas });


Scene:3D空間

Camera:視点

Renderer:描画担当

2. 台と壁の作成
const boardGeo = new THREE.BoxGeometry(12,0.5,20);
const board = new THREE.Mesh(boardGeo, boardMat);
scene.add(board);


ボールが落ちないように枠(Boundary)を設置

壁に当たると速度を反転させることで跳ね返りを実現

3. ボールの物理処理
let velocity = { x: 0, y: -0.02, z: 0.05 };
ball.position.x += velocity.x;
ball.position.y += velocity.y;
ball.position.z += velocity.z;


velocity を管理してX/Y/Z方向に動かす

重力や壁との衝突で反転、バンパーやフリッパーで跳ね返る

4. フリッパー操作
window.addEventListener("keydown", (e) => {
  if (e.key === "ArrowLeft") flipperLeftRot = 0.6;
});


キー入力でフリッパーの角度を変化させる

衝突判定でボールを跳ね返す

Three.js Pinball および他 6 ページ - 個人 - Microsoft​ Edge 2025_11_23 15_58_39.png


5. 衝突判定

バンパー:球体同士の距離を計算し跳ね返す

フリッパー:距離と方向ベクトルを使い速度を反射させる

const dx = ball.position.x - flipper.position.x;
const dz = ball.position.z - flipper.position.z;
const dist = Math.sqrt(dx*dx + dz*dz);

動画やGIFで動きを見せるとわかりやすい

ボールがフリッパーで跳ね返る様子

バンパーに当たってX/Z方向に反射する様子

まとめ

今回のピンボールゲームでは:

Three.js の 基本操作(Scene, Camera, Mesh)

物理的衝突判定(距離計算・法線ベクトルで速度反射)

フリッパー操作(キーボード入力による角度制御)

が学べます。

次のステップとして:

複数ステージ作成

得点システム追加

障害物の追加(スロープ、板、スピナー)
これらを実装予定です。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す ココナラコンテンツマーケット ノウハウ記事・テンプレート・デザイン素材はこちら