Appearance
第10回 スキンメッシュ基礎
前回: 第09回 影表現の基礎 / 次回: 第11回 PBRマテリアル
今回の授業内容
- 静的メッシュとスキンメッシュを区別する
- ボーン階層とボーンウェイトの役割を理解する
- バインドポーズとスキニング計算の概要を理解する
SkinnedMeshRendererの構成とBoundsを確認する- アニメーションするモデルへShader Graphマテリアルを適用する
- 変形、法線、マテリアルの問題を切り分ける
スキンメッシュとボーン
ボーンに合わせて変形するメッシュ

スキンメッシュの例ボーンの動きとウェイトを使い、メッシュを変形する
Skinned Mesh は、ボーンの動きに合わせて頂点位置が変化するメッシュです
キャラクターの腕、足、顔、服などは、 多くの場合スキンメッシュとして扱われます
1つの頂点は、1本のボーンだけではなく複数のボーンから影響を受けることがあります
その影響度を使って、関節周辺をなめらかに曲がるように見せます
静的メッシュとの違い
| 種類 | 主な用途 | 頂点の扱い |
|---|---|---|
| Static Mesh | 背景、小物、床、壁 | 基本的に形が変わらない |
| Skinned Mesh | キャラクター、服、変形する体 | ボーンに合わせて変形する |
静的メッシュは、モデルの頂点位置をほぼそのまま描画できます
スキンメッシュは、アニメーション中のボーン姿勢に合わせて頂点を変形してから描画します
シェーダーから見ると、キャラクターは 毎フレーム形が変わるメッシュ として扱われます
ボーンを使う理由
キャラクターの全頂点を、アニメーションごとに直接編集するとデータ量も作業量も大きくなります
ボーンを動かし、頂点がどのボーンへ追従するかを決めれば、 少ない制御点で大きな形状変化を作れます
ボーンは画面に表示するための形状ではなく、 メッシュを変形するための制御構造です
リギングでは、メッシュ、ボーン、ウェイトの関係を作り、 アニメーションで動かせる状態にします
メッシュを動かす骨格
Bone は、メッシュを変形するための Transform です
ボーンは単独で置かれるのではなく、 通常親子関係を持った階層として作られるます
たとえば肩を動かすと、上腕、前腕、手首、指も一緒に移動します
それぞれのボーンは位置、回転、スケールを持ちます
この変換の連鎖を詳しく確認したい場合は、座標空間と行列を参照してください
ジョイントとボーン
DCCツールやエンジンでは、ジョイント、ボーン、Transform という言葉が文脈によって使い分けられます
授業では、頂点へ影響を与える骨格要素をまとめてボーンと呼びます
大事なのは名前の違いではなく、 どのTransformが、どの頂点を、どのくらい動かすか です
関節位置がずれていると、肘や膝が不自然に潰れたり伸びたりします
子が親の変換を受けるボーン階層
text
Root
Hips
Spine
Chest
Shoulder_L
UpperArm_L
LowerArm_L
Hand_LHand_L の最終的な位置は、手首だけでなく腰、背骨、肩、腕の変換にも影響されます
このような階層変換を正しく扱うために、 3Dグラフィックスでは行列が使われます
今回は計算の全体像に触れ、詳細は次回扱います
ボーンウェイトとバインドポーズ
ボーンから受ける影響度

左手のボーンの影響度赤いほど影響が強く、青いほど影響が弱い
Bone Weight は、頂点が各ボーンから受ける影響度です
1本のボーンに完全に追従する頂点もあれば、 複数ボーンの動きを混ぜる頂点もあります
たとえば肘の近くの頂点は、上腕ボーンと前腕ボーンの両方から影響を受けます
影響度の合計は、通常 1.0 になるように扱います
合計が1.0になるウェイト
| 頂点 | 上腕 | 前腕 | 結果 |
|---|---|---|---|
| 肩に近い頂点 | 1.0 | 0.0 | 上腕に完全追従 |
| 肘の中央 | 0.5 | 0.5 | 2本の動きを半分ずつ混ぜる |
| 手首に近い頂点 | 0.0 | 1.0 | 前腕に完全追従 |
ウェイトが急に切り替わると、関節が折れたように見えます
ウェイトをなめらかに変化させると、曲がり方もなめらかになります
ただし広く混ぜすぎると、動きがぼやけて形が締まりません
通常は、1頂点あたり最大4本程度のボーン影響を扱います
変形品質を調整するウェイトペイント
Weight Paint は、頂点ごとのボーン影響度を色やブラシで編集する作業です
赤や白に近いほど影響が強く、青や黒に近いほど影響が弱い表示がよく使われます
関節、肩、腰、指、顔の周辺は、 ウェイトの調整で見た目が大きく変わります
シェーダーだけでなく、モデルデータ側の品質もキャラクターの見た目に直結します
変形の問題を切り分ける
- 肘や膝が潰れる
- 肩を上げると胴体まで引っ張られる
- 指を曲げると隣の指も動く
- 服や髪が体に追従しすぎる、または追従しない
- アニメーション中にメッシュが消える
これらは、ウェイト、ボーン階層、Bounds、マテリアル、 シェーダー設定のどこかに原因がある可能性があります。
メッシュとボーンの初期状態

典型的なTスタンスでのバインドポーズの例
Bind Pose は、メッシュをボーンへ関連付けた最初の基準姿勢です
スキニングでは初期状態でボーンとメッシュを対応させ、相対的な位置関係を記録します
アニメーションでの変形は、初期状態からどう移動したかで計算されます
たとえば腕を上げた姿勢でバインドされたモデルなら、そこから腕がどのように回転したかの相対変化を使って頂点位置を求めます
バインドポーズが必要な理由
頂点は、バインドポーズ時点でのボーンとの位置関係を持っています
現在のボーン行列だけでは、頂点が基準姿勢でボーンに対してどこにあったかを扱えません
そこで、バインドポーズの逆変換で基準姿勢を打ち消してから、現在のボーン変換を適用します
この「基準から現在への変換」が、スキニング計算の中心になります
スキニングの計算と描画
ボーンの変形結果を重み付きで加算する
各頂点は、影響するボーンごとに変形されます
変形後の位置にウェイトを掛け、 それらを足し合わせた結果が最終的な頂点位置になります
1頂点へ影響できるボーン数には、インポート設定や品質設定による上限があります
本数を増やすと細かな変形を表現できますが、データ量と計算量も増えます
各ボーンで変換した頂点
ボーンウェイトを掛ける
重み付きの変換結果
重み付きの変換結果
すべて加算する
合算結果
合算結果
最終位置として使用する
現在姿勢の頂点位置
この回では式を実装せず、ウェイトを変えたときの見た目から仕組みを確認します
詳しい変換はボーン階層とスキニング変換で扱います
法線も変形する
スキンメッシュでは、頂点位置だけでなく法線も変形されます
通常は頂点と同じく、ボーンの影響を受けて回転した後合算し、 正規化によって整えて使用されます
法線が正しく変形されないとライティングが不自然になりますが実際には物理的に正しい変形とは限らないため、曲率の高い箇所では手動での調整が必要になる場合もあります
SkinnedMeshRenderer
Unity では、スキンメッシュの描画には SkinnedMeshRenderer が使われます
MeshRenderer と違い、ボーン、ウェイトなど変形に必要な情報を扱います
キャラクターモデルに Shader Graph のマテリアルを適用する場合も、 実際に描画するのは SkinnedMeshRenderer です
通常の利用ではUnityがスキニング処理を組み立てるため、利用者がボーン行列の計算を実装する必要はありません
Shader Graphでは、スキンメッシュへ色、法線、質感や追加の頂点変形を適用できます
スキニングの描画コスト
スキンメッシュは、ボーン姿勢に合わせて頂点と法線を毎フレーム更新します
負荷は頂点数、影響ボーン数、表示するキャラクター数、影や追加パスなどで変わります
Unity内部の実行方式はレンダーパイプライン、プラットフォーム、設定によって異なります
特定の実装方式を前提にせず、Profilerで対象環境を計測して判断します
Boundsとカリング
Bounds は、Renderer がそのメッシュを描画対象として扱う範囲です
カメラ外にあると判断された Renderer は、描画を省略されることがあります
スキンメッシュはアニメーションで形が変わるため、 Bounds が小さすぎると、まだ見えているはずの部分が消えることがあります
このため、ある程度の変形を見込んで余裕をもった Bounds が設定されます
ただし大きすぎる Bounds は余計な描画を増やすため、 適切な設定が必要です
Shader Graphをキャラクターへ適用する
通常のマテリアルと同じように適用する
Lit Shader Graph のマテリアルは、 キャラクターの SkinnedMeshRenderer にも適用できます
Unity 側がスキンメッシュの変形を処理するため、 通常の色、テクスチャー、法線マップ、フレネル表現等が利用可能です
追加の頂点変形を行う場合は、入力される位置がどの座標空間にあり、スキニングとどの順序で処理されるかを確認します
既習内容をキャラクター表現へ組み合わせる
第03回のテクスチャーとUVで、キャラクターの色や模様を扱う
第04回の Alpha Clip で、髪、まつげ、服飾パーツを切り抜く
第06回のノイズで、魔力、ダメージ、汚れ、発光の揺らぎを作る
第08回のフレネルで、輪郭強調やバリア表現を作る
第09回の影設定で、キャラクターの接地感を調整する
スキンメッシュは、これらの表現を動くキャラクターへ適用するための土台です。
実習:キャラクターに Shader Graph を適用する
変形と見た目を分けて確認する
実習1:スキンメッシュを確認する
- Humanoid または Generic のキャラクターモデルをシーンに配置する
SkinnedMeshRendererを持つ GameObject を探すMesh、Root Bone、Bones、Materialsの項目を確認する- アニメーションを再生し、メッシュがボーンに追従することを確認する
MeshRendererではなくSkinnedMeshRendererが使われている理由を説明する
実習2:ウェイトの影響を観察する
- 関節が大きく曲がるアニメーションを再生する
- 肘、膝、肩、腰など、変形が目立つ場所を確認する
- 変形が自然な場所と、不自然な場所を比較する
- 不自然に見える場合、ウェイト、ボーン位置、法線のどれが原因に近いかを考える
- スクリーンショットを取り、原因の仮説をメモする
実習3:Shader Graphマテリアルを適用する
- キャラクター用の Lit Shader Graph を作成する
- Base Color、Normal Map、Smoothness などを調整する
- キャラクターの
SkinnedMeshRendererにマテリアルを適用する - アニメーション中も質感が破綻しないか確認する
- 影を受けるか、影を落とすかを確認する
実習4:リムライトを追加する
- Shader Graph に
Fresnel EffectまたはDot Productベースのリムライトを追加する - リムライトの色と強さをプロパティ化する
- カメラを回転し、輪郭側で効果が変わることを確認する
- アニメーション中のシルエットで見え方を確認する
- 強すぎる場合は、Power や強度を調整する
実習5:Boundsと表示範囲を確認する
- キャラクターを大きく動かすアニメーションを再生する
- Scene View で Renderer の Bounds を確認する
- メッシュの一部が突然消える場合、Bounds が小さすぎないか確認する
- 影やカリングに影響していないか確認する
- 表示が安定する範囲を考える
授業内課題:キャラクター用マテリアルを作る
動いている状態で見た目を確認します
完成条件
SkinnedMeshRendererを持つキャラクターモデルに適用している- アニメーション再生中にメッシュが正しく変形している
- Shader Graph で Base Color または Texture を設定している
- リムライト、フレネル、ノイズ、Alpha Clip のいずれかを使っている
- 影を受ける、または影を落とす状態を確認している
- スクリーンショットまたは短い動画で、動作中の見た目が確認できる
見た目の問題を切り分ける
- キャラクターの変形は自然か
- 関節周辺に強い潰れや引っ張られがないか
- マテリアルはアニメーション中も破綻していないか
- リムライトやノイズが意図した場所に出ているか
- 影、透明、Bounds の問題が起きていないか
- 問題がある場合、モデル、Renderer、Shader Graph のどこを疑うか
確認項目
- スキンメッシュがボーンで変形するメッシュであることを説明できる
- ボーンウェイトが頂点ごとの影響度であることを説明できる
- バインドポーズが変形前の基準姿勢であることを説明できる
SkinnedMeshRendererが扱う情報を確認できる- Shader Graph マテリアルをキャラクターへ適用し、変形と見た目を分けて確認できる
今回のまとめ
- スキンメッシュは、ボーンの動きに合わせて頂点を変形するメッシュです
- ボーンウェイトは、各頂点がどのボーンからどれだけ影響を受けるかを表します
- バインドポーズは、メッシュとボーンを結び付けたときの基準姿勢です
- Unity では
SkinnedMeshRendererがメッシュ、ボーン、ウェイトを扱います - キャラクター表現では、モデルデータ、Renderer、Shader Graph を分けて確認することが重要です