個人ブログのようなものです。とくにジャンルはありません。
アシュリー、魔法はよいこになってから!(全3巻)
商品ページ
Amazon
※非収益広告
記事の概要
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-01
作成日:2025-04-13
最終更新日:2025-04-13
記事の文字数:3974
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ページ上に表示する方法を載せています。
以下のステップにしたがってコード例を載せています。

(以降のPartも含めて)本稿で用いるvrmのバージョンは「0」前提です
座標軸が違うらしいので、1とかを使うと向きが狂うと思います。
サンプルコード内に含んでいるvrmファイルもバージョン0にしています。

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件が表示されます
コメント投稿




画面下部の「コンタクト」からも連絡可能です。
世界征服彼女 -Switch
商品ページ
Amazon
※収益広告
管理人作品宣伝
ChatGPT-アイコンと名前変更
Chrome 拡張機能 / 最終更新:2023-12-14
ChatGPTのアイコン等を自分の好みに変えられます。好きなキャラと話しているような気…ChatGPTのアイコン等を自分の好みに変えられます。好きなキャラと話しているような気分になれるかもしれません。

ChromeWebストアで閲覧する
利用素材等の詳細情報
【アークナイツ】アークナイツ運動会-関所破壊レース
動画 / 最終更新:2025-01-16
アークナイツ生息演算の岸壁の関の関門を誰が最速で破壊できるかを競います。…アークナイツ生息演算の岸壁の関の関門を誰が最速で破壊できるかを競います。

YouTubeで閲覧するニコニコ動画で閲覧する
利用素材等の詳細情報
作品一覧はこちら
関連ページ
three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する Part-03
概要 three.js・three-vrm.jsを使用して、VRoidをWebページ上に表示する方…
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では「楽しい」「悲しい…
管理人ツイート
本サイトのタグ一覧
NovelAIR18VRoidWebサイト作成Webツールととモノ。アークナイツアークナイツ-ステージ攻略日記アズールレーンアズールレーン-日記ウマ娘ギャラリーゲームデビラビローグプログラミングホラーポケットタウン怪談気ままな日記情報技術情報技術-WebAPI知的財産権統合戦略白夜極光本サイトについて魔王スライム様がんばる!漫画
人気記事
メイド・オブ・ザ・デッド-攻略お助け情報
ネタバレ注意! 本ページは『メイド・オブ・ザ・デッド』の情報を記録しているものです。 攻略の参考に…
651.6585 pt
ポケットタウン_パズル一覧
グレーのピースの数 (Number of gray pieces):検索グレーピースの数を入力して、…
648.2143 pt
剣と魔法と学園モノ。2G - パーティ編成確認ツール
ツール概要 ととモノ。2Gのパーティ編成を考える際に使うツールです。 あくまでストーリークリアまで…
159.1413 pt
アークナイツ-昇進2率ランキング
アークナイツのTier表を作る際の備忘録です こちらのページで、昇進2率を基にTier表を作ろうと…
104.2237 pt
アークナイツ-常設商品-理性換算
概要 "常設商品でお得な商品はどれか"というのを理性に換算して一覧化したものとなります。 絶対的に…
75.7576 pt
ロックマンエグゼ3-バグのかけら必要数まとめ-
バグのかけら必要数 必要数 これぐらいあれば足りるはず。 コレクト要素に関わる部分だけなら、ギガチ…
75.3725 pt
アークナイツ-大陸版とグロ版(日本版)の実装遅れの比較
大陸版とグローバル版(日本版)の実装遅れの比較 別で実装スケジュールなるものを作っており、そこでは…
62.1607 pt
アークナイツ:統合戦略#5「サルカズの炉辺奇談」-「心打つ鍵鞭」攻略お助け情報
概要 統合戦略#5「サルカズの炉辺奇談」の公式サイトからできる「心打つ鍵鞭」についての、攻略お助け…
55.1837 pt
最新記事
アークナイツ-2025大感謝祭・春商品-理性換算
概要 "「2025大感謝祭・春商品」でお得な商品はどれか"というのを理性に換算して一覧化したものと…
本サイトについて
本サイトの概要 概要 個人ブログのようなものです。とくにジャンルはありません。 本サイト内の情報に…
ヒカルの碁で、なぜ佐為は消えたのか
概要 ヒカルの碁で佐為が消えた理由について、「ヒカルの才能を目覚めさせるという役割を終えたから」と…
剣と魔法と学園モノ。3 - 各ステータス最高・最低となる「種族」「メイン学科」「サブ学科」の組合せ
概要 「ととモノ。3」で各ステータス最高・最低となる「種族」「メイン学科」「サブ学科」の組合せを一…
『ToHeart』プレミアムエディション -Steam 【特典】TVアニメ『ToHeart』Blu-ray Disc(全13話・2枚組)同梱
商品ページ
Amazon
※収益広告