個人ブログのようなものです。とくにジャンルはありません。
D.C.Ⅱ.S.S.~ダ・カーポⅡセカンドシーズン~(TV番組)
商品ページ
Amazon
※非収益広告
記事の概要
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-01
作成日:2025-04-13
最終更新日:2025-04-13
記事の文字数:3869
VRoidWebツール情報技術
本記事のトピック
  • 概要
  • 1. JSモジュールの読み込み
  • 2. VRoidモデルの読み込み
  • 3. 表示用canvasの用意
  • 4. シーンの表示
  • 5. ライトの表示
  • 6. VRoidモデルの表示
  • 7. カメラの設定
  • 8. カメラで撮影した内容を表示&毎フレーム更新
  • サンプルコードはこちら
  • 今回書けなかった内容
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-01
概要

three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方法を載せています。
以下のステップにしたがってコード例を載せています。

WebページにVRoidを表示する大まかなステップ

  1. JSモジュールの読み込み
  2. VRoidモデルの読み込み
  3. 表示用canvasの用意
  4. シーンの表示
  5. ライトの表示
  6. VRoidモデルの表示
  7. カメラの設定
  8. カメラで撮影した内容を表示&毎フレーム更新

また、合わせて実際に動作確認できる(であろう)サンプルコードも下部に載せています。

1. JSモジュールの読み込み

以下のJSモジュール(ライブラリ)を使用しています。

・three.js(Web上で3Dを表示するための基本的なモノが入っている)
・GLTFLoader.js:gltfモデルを読み込む(VRoidもgltfを拡張している)
・OrbitControls.js(カメラを動かせるようにする)
・BufferGeometryUtils.js(GLTFLoader.jsにて使用)
・three-vrm.js(VRoidを読み込むのに使用)

これらのモジュールをあらかじめ以下のように読み込んでおく必要があります(BufferGeometryUtils.jsは不要)。

import * as THREE from './three.module.js'; import { GLTFLoader } from './GLTFLoader.js'; import { OrbitControls } from './OrbitControls.js'; import { VRMLoaderPlugin } from './three-vrm.module.min.js';
2. VRoidモデルの読み込み

VRoidモデルの読み込みは以下で簡単にできます(これは読み込みだけなので、画面上には表示されない)。

// VRoid読み込み const loader = new GLTFLoader(); loader.register((parser) => new VRMLoaderPlugin(parser)); loader.load( './model.vrm', // vrmファイルへのパスを書く (gltf) => { // ここに読み込み完了した後の処理、すなわち「3」以降のコードを書いていく }, (progress) => { // 読み込み中の処理 console.log(`進捗率:${parseInt(100.0 * (progress.loaded / progress.total))}%`); }, (error) => console.error(error) // 読み込み失敗したときの処理 );

説明もコード中にあるので、分からなければ読んでください。

3. 表示用canvasの用意

あらかじめモデル(というより3D空間)をWebページ上に表示するためのcanvasを用意しておきましょう。

// とりあえず縦横300pxとする const canvasWidth = 300; const canvasHeight = 300; // canvasの用意 const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize( canvasWidth, // canvasの横幅 canvasHeight // canvasの縦幅 ); document.body.appendChild(renderer.domElement); // canvasを画面上に追加
4. シーンの表示

とにもかくにもシーン(3D空間)の設定が必要です。

// シーンの設定 const scene = new THREE.Scene(); scene.background = new THREE.Color(0xffffff); // 背景色の設定
5. ライトの表示

明かりがないと真っ暗です。明かりの設定をします。
ライトのタイプは色々ありますが、ここでは太陽のように特定の場所から光を出して明るくするタイプにしています。

// ライトを設定してシーンに追加 const light = new THREE.DirectionalLight(0xffffff, 3.0); light.position.set(1.0, 1.0, 1.0).normalize(); scene.add(light); // シーンに追加するのを忘れない
6. VRoidモデルの表示

ここでようやくVRoid表示。読み込んだVRMをシーンに追加するのみ。

// VRMモデルを設定してシーンに追加 const vrm = gltf.userData.vrm; scene.add(vrm.scene);
7. カメラの設定

一番大切かもしれない、カメラ設定をします。

必須ではないですが、
OrbitControls(カメラをユーザ操作で動かせるようにする)を使うために「注視点の設定」と、モデルの顔付近にあらかじめカメラを移動しておくための「初期位置」設定も入れています。

// カメラの設定 const camera = new THREE.PerspectiveCamera( 35, canvasWidth / canvasHeight, 0.1, 1000 ); // カメラの初期位置関連の定義 const DEFAULT_CAMERA_CONFIG = { position: { // カメラ初期位置の補正 x: -0.15, y_heightOffset: 0.025, z_distance: 0.4, }, targetPos: { // カメラ注視点の補正 x: 0.04, y: 0, z: 0, } }; // 注視点の設定(頭を基準に調整) const vrmHeadPos = new THREE.Vector3(); vrm.humanoid.getRawBoneNode('head').getWorldPosition(vrmHeadPos); // モデルの頭を基準にする(最初からモデルの顔が出ている状態にしたいので) const controls = new OrbitControls(camera, renderer.domElement); vrmHeadPos.x += DEFAULT_CAMERA_CONFIG.targetPos.x; vrmHeadPos.y += DEFAULT_CAMERA_CONFIG.targetPos.y; vrmHeadPos.z += DEFAULT_CAMERA_CONFIG.targetPos.z; controls.target.copy(vrmHeadPos); // カメラの初期位置の設定(頭を基準に調整) const cameraPos = vrmHeadPos.clone().add( new THREE.Vector3( DEFAULT_CAMERA_CONFIG.position.x, DEFAULT_CAMERA_CONFIG.position.y_heightOffset, DEFAULT_CAMERA_CONFIG.position.z_distance ) ); camera.position.copy(cameraPos); // カメラ設定を反映 controls.update();
8. カメラで撮影した内容を表示&毎フレーム更新

カメラで撮影した内容をあらかじめ用意しておいたcanvasに表示します。

1回表示するだけなら、「renderer.render(scene, camera);」だけで良いのですが、カメラで撮影した内容を毎フレーム更新するために、以下のように定期的に更新する形にする必要があります。

animate();
function animate() { // 定期的にanimateを呼び出し、canvas表示内容を更新 requestAnimationFrame(animate); renderer.render(scene, camera); }
サンプルコードはこちら

サンプルコードはGitHubにあります。

多分ローカル上では動かないので、どこかのサーバにアップするなりして動作確認してください。

なお、サンプル内に今回使用したJSライブラリ(モジュール)も含んでいます。これらは、three-vrmはピクシブ(Pixiv株式会社)、それ以外はthreejsのオープンソースプロジェクトによって提供されているものなので、公開する際はそのあたりの判断はご自身で行った上でお願いします(と言ってもどちらもMITライセンスなので気にしなくていいかもしれませんが)。

今回書けなかった内容

次書く機会があれば、以下を書こうと思います。

  • ポーズ / 表情の変更方法
  • 口の形の変更方法
  • (ほどほどだけど)きちんとカメラ目線にする
  • 変なテクスチャが表示されてしまう問題→サンプルコードで使用しているVRoidの首や背中に黒いテクスチャが出る
  • 解像度問題の対応→スマホのような高解像度端末だと、表示が綺麗にならない
コメントログ
※コメントは最新50件が表示されます
コメント投稿




画面下部の「コンタクト」からも連絡可能です。
アシュリー、魔法はよいこになってから!(全3巻)
商品ページ
Amazon
※非収益広告
管理人作品宣伝
【アークナイツ】グムがずっと殴ってくれる動画
動画 / 最終更新:2025-02-14
喝を入れたいあなたに。…喝を入れたいあなたに。

YouTubeで閲覧する
利用素材等の詳細情報
ぱらぱら工房
Webサイト / 最終更新:2025-03-26
jpegやpngなどの静止画画像ファイルを複数枚結合して、GIFやAPNG(アニメーシ…jpegやpngなどの静止画画像ファイルを複数枚結合して、GIFやAPNG(アニメーション付きPNG)を作成するだけのWebツールです。

HPで閲覧する支援特典
利用素材等の詳細情報
作品一覧はこちら
関連ページ
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-02
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-01
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
GIF / APNG(アニメーション付きPNG)ファイル解析ページ
ファイル読込・操作 以下に調べたいファイルを読み込ませてください。 ファイル情報 カラーパレットを…
gifler.js仕様メモ
本ページの趣旨 「gifler.js」という、gifアニメーションをcanvasに簡単に表示できる…
普通の文章をホラーっぽく変換
テキスト:ホラー変換 変換する度に結果が変わります 変換回数: 変換する 変換結果 変換する…
【プログラミング】実例で分かるかもしれない再帰処理
本ページは以下動画の台本を書き起こしたものです 解説の趣旨・方向性 皆さん、こんばんは今回はプログ…
管理人について
「ふじみ むい」と言います ひょんなことから肉体を得たのでその肉体を使って活動をしています。 とい…
SNSツイート一元化対応(Twitter・Misskey・Mastodon・Bluesky)-公開
概要 SNSツイートを一元化するためのツールを作成しています(古い記事ですが、こちらのページで紹介…
VRoidを使う前に絶対に表情はいじった方が良いと思うという話
デフォルトのVRoidの表情はすごいVRoidっぽい VRoidStudioでは「楽しい」「悲しい…
Twitter:【日替わり】一問一答自己紹介テーマ
Twitter:【日替わり】一問一答自己紹介テーマ 日替わりで簡単な質問が表示されます。 毎日つぶ…
管理人ツイート
本サイトのタグ一覧
NovelAIR18VRoidWebサイト作成Webツールととモノ。アークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ギャラリーゲームデビラビローグプログラミングホラーポケットタウン怪談気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画
人気記事
メイド・オブ・ザ・デッド-攻略お助け情報
ネタバレ注意! 本ページは『メイド・オブ・ザ・デッド』の情報を記録しているものです。 攻略の参考に…
989.6480 pt
ポケットタウン_パズル一覧
グレーのピースの数 (Number of gray pieces):検索グレーピースの数を入力して、…
789.6056 pt
剣と魔法と学園モノ。2G - パーティ編成確認ツール
ツール概要 ととモノ。2Gのパーティ編成を考える際に使うツールです。 あくまでストーリークリアまで…
145.8605 pt
アークナイツ-昇進2率ランキング
アークナイツのTier表を作る際の備忘録です こちらのページで、昇進2率を基にTier表を作ろうと…
89.6533 pt
アークナイツ-常設商品-理性換算
概要 "常設商品でお得な商品はどれか"というのを理性に換算して一覧化したものとなります。 絶対的に…
88.3600 pt
ロックマンエグゼ3-バグのかけら必要数まとめ-
バグのかけら必要数 必要数 これぐらいあれば足りるはず。 コレクト要素に関わる部分だけなら、ギガチ…
76.4211 pt
アークナイツ:統合戦略#5「サルカズの炉辺奇談」-「心打つ鍵鞭」攻略お助け情報
概要 統合戦略#5「サルカズの炉辺奇談」の公式サイトからできる「心打つ鍵鞭」についての、攻略お助け…
63.1579 pt
アークナイツ-5周年商品-理性換算
概要 "「5周年商品」および「新常設商品」でお得な商品はどれか"というのを理性に換算して一覧化した…
48.0000 pt
最新記事
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-02
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-01
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
スペシャルサンクス
順不同、敬称略。 サイト構築系 全般 ・さくらインターネット:レンタルサーバ ・GitHub:ソー…
本サイトについて
本サイトの概要 概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報に…
新装版 タイム・リープ〈上〉 あしたはきのう (メディアワークス文庫)
商品ページ
Amazon
※収益広告