IKを切ったVMDで脚が引き戻される|VMDのIKオン/オフ(IK・表示ブロック)の中身

モーションの上半身は動くのに、脚だけが曲がったまま固まる。原因の1つが、VMDに書かれた「IKを切る」指定を再生側が無視していることです。IKを切る前提で作られたモーションは、足IKのボーンを動かしていないため、IKが効いたままだと脚が初期位置へ引き戻されます。

最終更新: 2026-10-06 · kphp同梱の実VMD 30本のIK・表示ブロックを読み、人物Aのモデルでの再生(足首の位置)をブラウザで測って確認

手元の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は切られずに残ります。