MID2Motion (1.2.1) | 2015-11-07 15:31 |
MMDIKSolver (1.2) | 2015-06-13 19:45 |
MMDMotion (1.5.1) | 2015-11-05 17:38 |
MikuMikuDance のIK (インバース・キネマティクス)を事前計算して、 モーションファイルに書き戻します。
MMD で腕とか足とかあるモデル(人型とは限らない)を使っていて、 腕先をまっすぐ直線に動かしたい(ストレートパンチとか)とか、 壁や棒の表面をなぞりたい(雑巾がけとか)と思ったことないでしょうか。
でも、モデルって根元から回転させて姿勢を決めるので、円弧は簡単にできるけど、 直線とか難しいですよね。そういう時は、人間ががんばるのではなくて、 当然コンピューターに腕の角度などを計算させるのです。 それが、IK (インバース・キネマティクス)です。
MMD にも、IK をする機能は当然ありますが、はじめからモデルに組み込んでないとつかえなかったり、 IK で出した回転角は全く記録されないとか、IK で動かしたボーンの子ボーンは付いてこないなど、 限定的です。自分でモデルに改造して、動画作るだけならまだしも、 モーションの配布を予定しているひとは、IK ボーン改造をユーザーに強要することになります。 やったことある人は分かると思いますが、この改造はかなり複雑でしんどいもので、 誰でも簡単にできるものじゃありません。 さらに、IK を使用しないモーションを同時に適用できなくなるデメリットがあります。 また MMD の人型モデルは、大抵どこかの企業が著作権を持つキャラなので、 IK ボーン改造をしたモデルを再配布することは、ほぼ無理です。
じゃあ、どうすればいいか。IK の計算は本来ただのモーションなので、 MMD の外で IK 問題を解いて、腕の角度とかをちゃんとモーションファイルに書き出せばいいのです。 モデルのボーン構造だけ分かれば、結構簡単にできます。
MMD IK Solver リリースリスト 最新 Version 1.2.
java -jar MMDIKSolver-1.2.jar
javac -cp MMDIKSolver-1.2.jar;MMDMotion-1.3.jar;togagem-3.n3.jar (あなたの作ったjavaソース)
- public class SurfaceDrawingTest {
- private IKSolver iksolver;
- private Motion targetMotion;
- private Motion ikMotion;
- private Model targetModel;
- private Model ikModel;
- static public void main(String [] argv) {
- SurfaceDrawingTest test=null;
- System.out.println("Model Loading..");
- try{
- test=new SurfaceDrawingTest();
- }catch(FileNotFoundException e){
- System.err.println("ファイルが見つかりません: "+e);
- }catch(IOException e){
- System.err.println("IOエラー: "+e);
- }catch(MmdFormatException e){
- System.err.println("MMD ファイルとして異常: "+e);
- }
- if(test==null)
- System.exit(-1);
- System.out.println("All loaded!");
- test.setBones();
- test.solve();
- }
- }
- public SurfaceDrawingTest()
- throws FileNotFoundException, IOException, MmdFormatException{
- FileInputStream fis=new FileInputStream("test/教室.pmd");
- targetModel=Model.fromPMD(fis);
- fis.close();
- System.out.println("Model: "+targetModel.getName()+" Done!");
- fis=new FileInputStream("test/鼓カノン.pmd");
- ikModel=Model.fromPMD(fis);
- fis.close();
- System.out.println("Model: "+ikModel.getName()+" Done!");
- fis=new FileInputStream("test/target.vmd");
- targetMotion=new Motion().fromVMD(fis);
- fis.close();
- iksolver=new IKSolver();
- fis=new FileInputStream("test/kanon.vmd");
- ikMotion=new Motion().fromVMD(fis);
- fis.close();
- }
- public void solve(){
- Bone target=targetModel.get("右黒板DB3");
- Pose [] poses=targetMotion.get(target.getName());
- int frame;
- double distance;
- Motion results=new Motion(ikMotion.getModelName());
- for(Pose p:poses){
- frame=p.frame;
- // そのフレームの状態にする。
- ikModel.setPoses(ikMotion.getInterporate(frame));
- targetModel.setPoses(targetMotion.getInterporate(frame));
- // 変更フラグをリセットして変更したボーンだけを記録する.
- ikModel.resetChanged();
- distance=iksolver.solve(target.getPos());
- System.out.println("frame: "+frame+" distance: "+distance);
- results.putAll(ikModel.getChanged(), frame);
- }
すべてMIT License です。これは、
ということだけ、覚えて置いてください。
Copyright(c) 2010 olyutorskii, nazo. http://mikutoga.osdn.jp/
TogaGem は、3D動画制作ツール、MikuMikuDance(MMD)で用いられる 各種データファイルを読み込むためのJavaライブラリです。 著作者は、olyutorskii です。MIT License で転載・改変が認められております。 nazoが、PMX読み込みとMMD Ver. 9 用の補間関係で書き換えてます。 Ver. 3.n 系列のサポートページは、 http://osdn.jp/users/naz_o/pf/TogaGem/wiki/ です。 MMD Motion は、このライブラリーに強く依存しております。
Copyright (c) 2015 nazo http://mmdmotion-java.osdn.jp/wiki/MMDMotion
MMD のモーションを計算で生成するために作った Java ライブラリです。(これです。) 著作者は、nazo (ときどき Naz.) です。MMDIKSolver は、 ほとんどこれのおかげでできています。 MIT License で転載・改変が認められております。
Copyright (c) 2015 nazo http://mmdmotion-java.osdn.jp/wiki/MMDIKSolver
MMD のIK問題を計算で解くために作ったJavaライブラリです。(これ) MMD Motion for Java の初目的のライブラリーです。 著作者は、nazo (ときどき Naz.) です。 MIT License で転載・改変が認められております。
※ MMD開発者の樋口M氏とは、これらは無関係です。樋口M氏に問い合わせても 迷惑なだけなので、やめましょう。
MMD開発者の樋口M 氏:
http://www.geocities.jp/higuchuu4/index.htm
私設研究所 Neo-Tech-Lab.com 上田智章 氏:
MikuMikuDanceのモデルデータ(PMD)構造について: 『IK(Inverse Kinematics) bone』(その5)
この中で、述べられていることに対してちょっと意見。
「でもこの処理、方程式解けば反復法使わなくてもいいような気もするが、」
一応その通りで、動かすボーンが n 個なら、n 次方程式になります。 一般に 4次方程式以上は一般解の公式は存在しません。 よって結局、方程式を反復計算によって解くことになりますので、作業が大体同じになります。
「もしかして、local minimum問題を抱えている?」
評価関数が距離ではなく内積なので、local minimum はない (local maximumはある)はずですが、IK 問題は答えが1点(0次元)じゃなくて n-1 次の自由度があるので、常にターゲットまでの距離が 0 になっても、 いつでも同じ答えにならないことが普通におきます。この IK Solver と MMD の IK の答えが合わないことはざらにありますが、もともと答えはたくさんある問題なので、 バグとかじゃないです。何を言っているかというと、手首をある点に完全に合わせて、 ひじと腕のボーンだけを動かせるだけ動かそうとすると、 ひじが自由に円弧を描きます。自分の体で試したらすぐ分かると思います。
[PageInfo]
LastUpdate: 2015-06-20 07:18:37, ModifiedBy: naz_o
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:members