AIに作ってもらった3Dモデルは表示されるのに、動かない。動いているのに角度の数字が変わらない。こうした問題は、部品の表示と状態の計算を分けて確認すると原因を絞りやすくなります。
最初に確認するのは「描画」と「更新」
Three.jsの画面は、シーンに物体を追加しただけでは更新され続けません。`renderer.setAnimationLoop()` に登録した関数などを使い、画面を描き直す必要があります。
- 画面が真っ白:import、WebGL、カメラ、描画開始の問題を疑う
- 物体は出るが止まる:アニメーションループと状態更新を疑う
- 物体は回るが数字は止まる:表示パネルが別の値を参照している可能性を調べる
まずブラウザの開発者ツールでConsoleを開き、最初の赤いエラーを確認してください。エラーがない場合は、次に更新する値をログで追います。
動きを一つの状態から作る
例えば立方体の回転角度を `state.angle` に保持します。毎フレームの経過時間を使って値を更新し、その値を3D部品とラベルに反映する構成にします。
const state = { angle: 0, speed: 0.6 };
function advance(dt) { state.angle += state.speed * dt; }
function applyState() {
cube.rotation.y = state.angle;
angleLabel.textContent = `${(state.angle * 180 / Math.PI).toFixed(1)}°`;
}
renderer.setAnimationLoop(() => {
const dt = Math.min(clock.getDelta(), 0.05);
advance(dt);
applyState();
renderer.render(scene, camera);
});
この例は `cube`、`renderer`、`clock` と、ページ上で取得した `angleLabel` が存在する前提です。ラベルのHTMLを用意していなければ `angleLabel.textContent` でエラーになります。
このように、コードの一部だけをコピーすると前提の要素が欠けることがあります。AIの提案を使うときは、どの変数やDOM要素が必要かも一緒に確認しましょう。
よくある不具合を原因別に切り分ける
- 回転が速すぎる:フレームごとに固定値を足していないか。経過時間dtとの積で更新する
- 位置が想定と違う:object.positionは親の座標系に対する値。親子関係を確認する
- 角度がずれる:rotationはラジアン。度を表示するなら180/Math.PIを掛ける
- 数値だけ止まる:ラベルを更新する関数が毎フレーム実行されているか調べる
- 一瞬だけ飛ぶ:時間差dtが極端に大きくなる場面や、複数箇所からの状態更新を確認する
動作しないときにカメラを動かして隠すと、問題の場所が分からなくなります。確認した数値と画面の差をメモし、原因が分かったところだけを修正します。
確認用の最小テストを作る
複雑なモデルの前に、回転角度を固定した状態で3つのケースを確認します。例えば角度0なら正面、π/2なら90度、πなら180度となることを見ます。
const cases = [0, Math.PI / 2, Math.PI];
for (const angle of cases) {
cube.rotation.y = angle;
console.log((angle * 180 / Math.PI).toFixed(0) + "度");
renderer.render(scene, camera);
}
このコードは角度値の切り替えを確認する補助例です。各状態を視覚的に比較するには、コードを一度ずつ実行するか、スライダーなどで切り替えるUIを用意してください。瞬時にループを実行しただけでは、最終フレームしか見えないことがあります。
AIに修正を頼むときの情報
「動きません」だけではなく、次の情報を添えると原因を切り分けやすくなります。
- 利用環境:ブラウザ、Three.jsの導入方法、関係するパッケージ
- 再現手順:ページを開いてからどの操作をしたか
- 期待結果:たとえば90度回転したら角度表示も90度になる
- 実際の結果:画面、Consoleエラー、状態変数の値
- 対象コード:状態を更新する関数と表示する関数
修正案を受け取ったら、原因が説明できるかを確認し、元の不具合と別の動作が壊れていないかもう一度試しましょう。
動かすだけでなく、説明できる状態へ
複雑な3D制作では、動く部品とグラフや数値を同じ状態から求める設計が役立ちます。複数のパーツをばらばらに動かすのでなく、モデルを共通化する考え方です。
まずは一つの立方体で「角度を更新する→表示する→検証する」の順をつかんでください。その後、2つの部品やスライダーに進むと、自分で原因を追える範囲が広がります。
(3D風UI演出の作例については『立体感・3D・スケール変化!Swiperのユニークなエフェクト集』をご参照ください)
Three.js公式参考:Three.js公式マニュアル|Creating a Scene