IKを切ったVMDで脚が引き戻される|VMDのIKオン/オフ(IK・表示ブロック)の中身
モーションの上半身は動くのに、脚だけが曲がったまま固まる。原因の1つが、VMDに書かれた「IKを切る」指定を再生側が無視していることです。IKを切る前提で作られたモーションは、足IKのボーンを動かしていないため、IKが効いたままだと脚が初期位置へ引き戻されます。
手元のVMDがIKを切っているかは、PMX・PMD・VMDを調べるに入れると分かります。 切っていれば「IKを切る指定があります」と出ます。
IKを切るのは、脚を回転だけで動かすため
ふつうのダンスモーションは、足IK(左足IK・右足IK)の位置を動かし、ひざや足の曲がりはIKに計算させます。床に足を付けたまま体を動かせるからです。逆に、寝転ぶ・座る・脚を振り上げるような動きでは、IKを切って左足・左ひざ・左足首の回転を直接書くほうが扱いやすくなります。
実物のVMD 30本を数えると、IK・表示のブロックを持つものが6本、そのうち実際にIKを切っていたのは4本でした。残りの2本は、全部オンのまま状態を書いているだけです。
| VMD | 切っているIK | 足IKのキー | 脚(足・ひざ・足首)のキー |
|---|---|---|---|
| man.vmd | 足IK・つま先IK・髪IK(6本) | 0個 | 各1,380個 |
| src_man_denma.vmd | 足IK・つま先IK(4本) | 683個 | 各683個 |
| ad.vmd | 足IK・つま先IK・髪IK(6本) | 1,429個 | 足1,271個・ひざ1,287個 |
| negaeri.vmd | 足IK・つま先IK(4本)。腿IK・袖IKなど11本はオンのまま | 2個 | 足・ひざ5個、足首2個 |
man.vmd は足IKのキーを1つも持たず、脚を回転だけで動かしています。IKを切る指定を読まない再生では、いちばん崩れやすい形です。
ブロックの中身
IK・表示ブロックは、VMDの6つのブロックのうち最後にあります。古いVMDにはブロックそのものがありません。1件の大きさは、持っているIKの数で変わります。
| 項目 | 大きさ | 中身 |
|---|---|---|
| フレーム番号 | 4バイト | この状態に切り替わるフレーム |
| 表示 | 1バイト | モデルを表示するか(1で表示) |
| IKの数 | 4バイト | この後に続くIKの件数 |
| IKの名前 | 20バイト × IKの数 | Shift_JIS。ボーン名(15バイト)より長い |
| オン/オフ | 1バイト × IKの数 | 名前の直後に1つずつ。0で切る |
1件は 9 + 21 × IKの数 バイトです。状態は次の切り替えまで続き、補間はありません。 最初の切り替えより前は、全部オンとして扱います。実物には、ファイルの中で順番が前後しているものもありました(src_man_denma.vmd は 0, 6, 4, 4100 フレームの順に入っています)。フレーム番号で並べ直してから使ってください。
three.jsはこのブロックを読まない
three.js(r171)の MMDLoader がVMDを読むときに使うパーサは、ヘッダ・ボーン・表情・カメラの4つまでしか読みません。照明・セルフ影・IK・表示のブロックは読み飛ばされます。そのため、MMDLoaderのまま再生すると、VMDがIKを切っていても足IKは毎フレーム解かれます。
人物Aのモデルで man.vmd を再生し、左足首の位置を測りました。読まないままでは、足首の高さが3.8秒・9.2秒・16.1秒・26.1秒のどこでも4.03のままでした。足IKにキーが無いので、IKが足首を初期位置へ引き戻し続けていたためです。脚はひざから後ろへ折れたままになります。IKの指定どおりに切ると、ほぼ同じ時刻(4.7秒・8.9秒・16.2秒・26.3秒)の高さは4.08・4.48・4.34・4.99と、モーションに合わせて動きました。
このサイトの再生は、2026-10-06からIKのオン/オフをVMDの指定どおりに当てています。それより前は、ほかのthree.js製のプレイヤーと同じく無視していました。
結合・切り出しで気をつけること
- 途中から切り出すと、IKを切る指定が範囲の外に出ることがあります。 切る指定はたいてい0フレーム目にあるので、範囲内だけを残すとIKが戻ってしまいます。このサイトの切り出しは、先頭の状態を書き足す設定(既定でオン)のときに、その時点のIKの状態も先頭へ写します。
- IKを切るVMDの後ろに、IKを使うVMDを繋ぐと、後ろもIKが切れたままになります。 状態は次の切り替えまで続くためです。このサイトの結合は、後ろのVMDの頭に切り替えが無ければ、IKを全部オンへ戻す1件を足します。
- 別のモデルで使うときは、IKの名前もモデルと合っている必要があります。名前の合わないIKは切られずに残ります。