cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

ofxAssimpMeshHelperの修正

初稿: 2013/10/8, 最終更新: 2013/10/10  

13.ofxAssimpModelLoaderの修正

13.1 ライブラリの修正

ofxAssimpModelLoader.cpp, ofxAssimpModelLoader.hを置き換えてビルドしてください。念のため、元ファイルのバックアップを取っておくと良いでしょう。

ofxAssimpModelLoader.zip

meshHelperへの登録をメッシュのリストではなく、ノードに変更しています。ソースコードの解説は、長くなってしまったので省略します。デバッグが不十分ですので、他のプログラムに使うときは注意してください。

13.2 メッシュ呼び出し方法の変更

メッシュとノードが1対1で対応していることを想定し、メッシュにノードと同じ名前が与えるように変更しています。meshHelperのメッシュ番号がノードの探索順に変更されていますので、メッシュの参照が今までの物では正しく動作しません。

次のように、名前で関節を判定するように変更します。

//--------------------------------------------------------------

void testApp::mouseDragged(int x, int y, int button){

  if(button == 1 && !nearestIndex.empty()){

    cam.disableMouseInput();

    float value_x = x / (float)ofGetWidth();

    float value_y = y / (float)ofGetHeight();

 

    for(int i=0; i<(int)nearestIndex.size(); i++){

      aiString name = model.getMeshHelper(nearestIndex[i]).mesh->mName;

      if(name == aiString("CHEST_JOINT0_Link")){ chest = adjust_value(chest, value_x); }

      else if(name == aiString("HEAD_JOINT0_Link")){ pan =  adjust_value(pan, value_x); }

      else if(name == aiString("HEAD_JOINT1_Link")){ tilt = adjust_value(tilt, value_y); }

      else if(name == aiString("RARM_JOINT0_Link")){ rarm[0] = adjust_value(rarm[0], value_x); }

      else if(name == aiString("RARM_JOINT1_Link")){ rarm[1] = adjust_value(rarm[1], value_y); }

      else if(name == aiString("RARM_JOINT2_Link")){ rarm[2] = adjust_value(rarm[2], value_x); }

      else if(name == aiString("RARM_JOINT3_Link")){ rarm[3] = adjust_value(rarm[3], value_x); }

      else if(name == aiString("RARM_JOINT4_Link")){ rarm[4] = adjust_value(rarm[4], value_x); }

     else if(name == aiString("RARM_JOINT5_Link")){ rarm[5] = adjust_value(rarm[5], value_x); }

     else if(name == aiString("LARM_JOINT0_Link")){ larm[0] = adjust_value(larm[0], value_x); }

     else if(name == aiString("LARM_JOINT1_Link")){ larm[1] = adjust_value(larm[1], value_y); }

     else if(name == aiString("LARM_JOINT2_Link")){ larm[2] = adjust_value(larm[2], value_x); }

     else if(name == aiString("LARM_JOINT3_Link")){ larm[3] = adjust_value(larm[3], value_x); }

     else if(name == aiString("LARM_JOINT4_Link")){ larm[4] = adjust_value(larm[4], value_x); }

    else if(name == aiString("LARM_JOINT5_Link")){ larm[5] = adjust_value(larm[5], value_x); }

    }

  }

}

右手関節の座標系も表示されるように、draw関数内のメッシュの数を問い合わせる関数を変更します。

for(int i=0; i<model.getMeshCount(); i++){

f:id:cvl-robot:20131009020945j:plainfig.ofxAssimpModelLoaderの修正

ちゃんと両手が表示されるようになりました。