1
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?

Three.jsでglTFを読み込んでアニメーション再生するまで

Last updated at Posted at 2025-07-05

はじめに

Three.jsでglTF形式の3Dモデルを読み込んでアニメーションさせる方法を紹介します。
Blenderでボーンを仕込んでGLBファイルを作成し、Three.jsでそれを表示・再生していきます。
開発方法の選定

Three.jsを使う方法は大きく分けて以下の3つあります。
1,Node.js で npm install three
2,CDN方式(jsDelivrやunpkgなど)**で依存関係を手動管理
3,ESM (esm.sh) を使ってモジュールとしてimport(推奨)

今回は3の esm.sh を使います。依存関係のエラーも少なく、シンプルに始められます。
特にgltfに関してはmoduleタイプしか対応していないようなので、、、

ただskymateだと依存関係でのエラーが出たのでesmを使うことにしました
node もしくは esmで開発するのが楽だと思います
esmのほうがプロジェクト自体は圧迫しません ケースバイケースで

Three.jsでglTFを読み込む基本コード

import * as THREE from 'https://esm.sh/three@0.152.0';
import { GLTFLoader } from 'https://esm.sh/three@0.152.0/examples/jsm/loaders/GLTFLoader.js';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.set(0, 10, 80);

const renderer = new THREE.WebGLRenderer({ alpha: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

const loader = new GLTFLoader();
loader.load('path_to_your_model.glb', (gltf) => {
  const model = gltf.scene;
  model.rotation.y = Math.PI;
  scene.add(model);
});

function animate() {
  requestAnimationFrame(animate);
  renderer.render(scene, camera);
}
animate();

これでgltf自体は呼び出せました

次はモデルにアクションを入れてみます
glft->glbにします
記事下記のモデルを使いました

すでにアニメーションが入ったモデルなら記事下部まで飛んで結構です
blenderはまた詳しくやりたいと思います (まだまだ初心者ですが)
Blenderでボーンとアニメーションを作成する手順

Blenderでモデルを開く
Armature(ボーン)を追加
ミラー表示のため、画面右の蝶々マーク(X軸ミラー)をON
Shift + E で対称にボーンを伸ばす
モデルとボーンを結合
モデル→ボーンの順に選択し、Ctrl + P → 自動ウェイト
Weight Paintモードで重みを調整
Poseモードで動きを作り、Actionにキーフレームを登録
アニメーションをベイクして保存
.glbでエクスポート

Three.jsでアニメーション再生するコード

import * as THREE from 'https://esm.sh/three@0.152.0';
import { GLTFLoader } from 'https://esm.sh/three@0.152.0/examples/jsm/loaders/GLTFLoader.js';

let scene, camera, renderer, model, mixer, clock;

function init() {
  scene = new THREE.Scene();
  camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000);
  camera.position.set(0, 70, 85);
  camera.lookAt(0, -25, 0);

  renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true });
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.setClearColor(0x000000, 0);
  document.body.appendChild(renderer.domElement);

  clock = new THREE.Clock();

  const loader = new GLTFLoader();
  loader.load('rozen/rozen_shink2.glb', (gltf) => { //ここのパスを変える
    model = gltf.scene;
    model.rotation.y += (-Math.PI / 2);
    scene.add(model);
    
    if (gltf.animations && gltf.animations.length > 0) {
      mixer = new THREE.AnimationMixer(model);
      const action = mixer.clipAction(gltf.animations[0]);
      action.play();
    }
  });

  animate();
}

function animate() {
  requestAnimationFrame(animate);
  const delta = clock.getDelta();
  if (mixer) mixer.update(delta);
  renderer.render(scene, camera);
}

init();

使用したモデルとライセンス

このモデルは以下のライセンスの元、使用しています:

This work is based on "Rozen Maiden - Shinku"
https://sketchfab.com/3d-models/rozen-maiden-shinku-d73e367d8f0645bbab207143392efd8a
by victorberdugo1 licensed under CC-BY-4.0

動作はこちらから見れますー>index:気ままに動かしてそのままです
planeで飛行機、rozenでモデルが動きます
近々見た目を直したいです

This work is based on "Rozen Maiden - Shinku"
(https://sketchfab.com/3d-models/rozen-maiden-shinku-d73e367d8f0645bbab207143392efd8a)
by victorberdugo1, licensed under CC-BY-4.0

1
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
1
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?