2004年11月30日

簡易マッスルボーン1

モーションプラグインでマッスルボーンっぽいのを作ってみる。

上図の様なA、B、Cの3っのボーンがあって、Cにマッスルボーンを適用する場合
CはAの子で、Cの先端はBの動きに合わせたい。


Cの先端をpとして、pをワールド座標に変換、次にBのローカル座標に変換して、その座標を覚えておく。


pをワールド座標に変換、Cのローカル座標に変換する。この座標を元にCの角度、長さを変える。
オプションとして、体績を保持する。
Xscale=Yscale=√1/Zscale

 

GUI

参照:ボーンの先端の親?を指定
更新:点pの再取得
体績を保持:オプション

 

posted by toka at 22:43| Comment(0) | TrackBack(0) | LWプラグイン開発 | このブログの読者になる | 更新情報をチェックする

2004年11月25日

MirrorWeight

MirrorToolで作った左右対称のオブジェクトのウエイトマップを左右に分けるプラグインです。

ダウンロード
MirrorWeight[Intel]
SourceCode

コピー方向(X軸)

置換位置
接頭辞の例 Left_XXX, L_XXX
接尾辞の例 XXX_Left, XXX_L

元マップ、対象マップ
対象マップ名称(下のリストのdist)を作るときに使う、キー文字列
元マップ文字列を含むウエイトマップ名称(src)をもとに対象マップ名称(dist)を決定する

更新
下のリストを更新する

 

ウエイトマップをミラーコピーするプラグイン3

アクティベーション関数のコード
LWがプラグインを実行すると、この関数が呼ばれる
処理の流れは、
データの初期化
設定ファイルから読み込み
パネルに渡すデータを収集
パネルを開く
設定ファイルに保存
VMAPの修正


//アクティベーション関数
XCALL_(int)Activate(long version, GlobalFunc *global, LWModCommand *local, void *serverData)
{
  LWMessageFuncs *msgf = (LWMessageFuncs*)global( LWMESSAGEFUNCS_GLOBAL, GFUSE_TRANSIENT );
  MyData   data;
  if( LWMODCOMMAND_VERSION != version )
    return AFUNC_BADVERSION;
  if( !msgf )
    return AFUNC_BADGLOBAL;
  data.global = global;
 //設定読み込み
  readConfig(&data);
 //全ウエイトマップリスト作成
  listupAllWMap(&data);
  if( 0 == data.allwlist.size() ){
    msgf->error("ウェイトマップがありません。", NULL);
    return AFUNC_OK;
  }
 //ウエイトマップリスト作成
  listupEditWMap(&data);
 //パネル表示
  if( 0 == Panel(&data, global) ){
    return AFUNC_OK;
  }
 //設定保存
  writeConfig(&data);
  data.edit = local->editBegin(0, 0, OPSEL_GLOBAL);
 //ポイントスキャン
  data.edit->pointScan(data.edit->state, PointScanFunc, &data, OPLYR_PRIMARY);
  data.edit->done(data.edit->state, EDERR_NONE, 0);
  return AFUNC_OK;
}

 

ポイントスキャン関数のコード
すべてのポイントに対して呼ばれる
元になるウエイトマップの値を取得
成功したら、X座標にoperationの値(1or-1)をかける
0より大きければ、対象ウエイトマップに値を設定、元マップを削除
0ならば、対象ウエイトマップに値を設定



//ポイントスキャン関数
EDError PointScanFunc(void *scanData, const EDPointInfo *info)
{
  MyData  *data = (MyData*)scanData;
  MeshEditOp *edit = data->edit;
   int   result;
  float  val;
  for(int i=0; i<data->wlist.size(); i++){
    data->wlist[i].mapID = (LWID)edit->pointVSet(edit->state, (void*)data->wlist[i].mapID, LWVMAP_WGHT, data->wlist[i].src.c_str());
    result = edit->pointVGet(edit->state, info->pnt, &val);
    if( 0 != result ){
      if( 0.0 < (info->position[0] * data->operation) ){
        edit->pntVMap(edit->state, info->pnt, LWVMAP_WGHT, data->wlist[i].src.c_str(), 1, NULL);
        edit->pntVMap(edit->state, info->pnt, LWVMAP_WGHT, data->wlist[i].dist.c_str(), 1, NULL);
        edit->pntVMap(edit->state, info->pnt, LWVMAP_WGHT, data->wlist[i].dist.c_str(), 1, &val);
      }else if( 0.0 == info->position[0] ){
        edit->pntVMap(edit->state, info->pnt, LWVMAP_WGHT, data->wlist[i].dist.c_str(), 1, &val);
      }
    }
  }
  return EDERR_NONE;
}

posted by toka at 13:41| Comment(0) | TrackBack(0) | LWプラグイン開発 | このブログの読者になる | 更新情報をチェックする

2004年11月18日

ウエイトマップをミラーコピーするプラグイン 1

ウエイトマップをミラーコピーするプラグインを作る。
実際にはウエイトマップのミラーコピーではなくて、ミラーツールで作った左右対称のオブジェクトのウエイトマップを左右に分離させる。
↓こんな感じ
機能

パネルのメモ
GUI

データを一つの構造体に
//マルチリストコントロールで使いやすいように
typedef struct{
int active;
std::string src; //元Weightmap名称
std::string dist; //対象Weightmap名称
}WeightListData;

//メインデータ
typedef struct {
GlobalFunc *global;
std::vector wlist;
std::vector allwlist; //全Weightmapリスト
int operation; //コピー方向
int replace; //置換位置
std::string srcKey; //置換文字
std::string distKey; //置換対象文字
}MyData;

次回はGUIのコーディングの予定
posted by toka at 17:29| Comment(0) | TrackBack(0) | LWプラグイン開発 | このブログの読者になる | 更新情報をチェックする

WindowsXP SP2

WindowsXP Tablet PC Edition 2005の手書き入力パネルが、かなり便利になってる!
しかし、あの悪名高いSP2をインストールしなければならないらしい。
どうせ誇張された噂だろうとインストールしてみたら・・・
まず無線LANの設定がクリアされてるし、設定の仕方が変わってるし、設定ウィザードってのは途中でエラーが出て停まってしまうしで、散々な目に。
ウィザードでエラーが出ても設定完了までいける選択肢があったのでそれを選択。警告のバルーンがいくつか出たが、なんとか設定できた。
で、入力パネルを試そうとしたら・・・_| ̄|○!!!!
なんでOperaで機能しませんか?わざとですか?他のソフトではちゃんと機能するというのに。
おまけにハードウエアボタン(?)が使えなくなった。
セットアップし直した(SP1)

↑HPのTC1100(AA)
posted by toka at 17:10| Comment(0) | TrackBack(0) | 雑記 | このブログの読者になる | 更新情報をチェックする

2004年11月17日

Borland C++Builder6 でビルド

Borland 版の SDK ライブラリをビルド(server.lib)



ファイル(F)→新規作成(N)→その他(O)
メニュー→新規作成

新規作成ダイアログが開く
新規作成タブ→ライブラリ
新規作成→ライブラリ

ファイル(F)→プロジェクトに名前を付けて保存(E)
適当なフォルダを作って保存

プロジェクト(P)→プロジェクトに追加(A)
servdesc.c、username.c、startup.c、shutdown.c を先ほど作ったフォルダにコピーして追加する

プロジェクト(P)→オプション(O)

コンパイラタブの「リリース」ボタンを押す
オプション→コンパイラ

TLibタブの「共有 RTL DLL を使う(R)」のチェックを外す
オプション→TLib

プロジェクト(P)→server をメイク(M)

LWプラグインをビルド


SDK付属のサンプル
lwsdk80\sample\Modeler\CommandSequence\boxes\box1\box.c
をビルドする

ファイル(F)→新規作成(N)→その他(O)
メニュー→新規作成

新規作成ダイアログが開く
新規作成タブ→DLLウィザード
新規作成→DLLウィザード

プロジェクト(P)→オプション(O)

アプリケーションタブの、ターゲットファイル拡張子を「dll」から「p」に変更

ディレクトリ/条件タブの、インクルードパスの右端のボタンを押す

LWSDKのフォルダを指定して追加ボタンを押す
インクルードパス

server.lib、servmain.c、serv.def、box.cをフォルダにコピーして、プロジェクトに追加する

プロジェクト(P)→box をメイク(M)
posted by toka at 18:10| Comment(0) | TrackBack(0) | LWプラグイン開発 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は90日以上新しい記事の投稿がないブログに表示されております。