2004年12月16日

GradientWeightmap4

右にドラッグすると範囲が広がります

Mode: 適用方法です
 Overwrite 範囲内を上書きします。
 Replace ウエイトマップをクリアしてから上書きします
 Add 既存の値に加算します

ダウンロード[Intel]

ソースコード

GradientWeightmap3

結局前回の1の方法を採用した
再帰的に隣接するポイントを探していく方法も失敗したので↓の方法で
最初に総ポイント数のメモリを確保
選択されているポイントの情報を配列の前から順に格納、終端にNULL
配列の頭から順に隣接するポイントを探す
配列に含まれていないポイントなら配列の終端に追加、NULLを後ろにずらす
終端のNULLに追いつくまで順に繰り返す

↑の処理をするタイミングは
インスタンスデータに関数のポインタを持たせて、build関数内でそれを実行する
最初やリセット直後はポイントリスト作成関数のポインタを入れておいて
ポイントリスト作成関数の最後でvmapを操作する関数のポインタをいれるようにした

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

2004年12月14日

GradientWeightmap2

隣接するポイントの取得方法で難航中 _| ̄|○

選択されたポイントが属するポリゴンから、隣接するポイントにマーキング。これを再帰的に繰り返していけば、 選択されたポイントからどれだけ離れているかという情報をすべてのポイントに持たせることが出来る(と思う)が、 この情報をどこに格納しておけばいいんだろ?

1.総ポイント数分のメモリを確保する
一番確実そうだけどポリゴンに属するポイントを探し出すに手間がかかりそう

2.MeshDataEditクラスにしてポイントのユーザーバッファを確保する
一番簡単かも、リアルタイムに範囲を確認できたほうがいいよなぁ。こんなのでパネル開いたり閉じたりってしたくないし

3.vmapに格納
俺様頂点マップタイプを作ってそれに格納。使った後で削除できるといいけど、削除出来なかったらゴミが残るなぁ、削除用のプラグインも作る?

1と3の場合はどのタイミングでこの処理をしたらいいんだろう
3日くらいで終わらす予定だったんだけどなぁ (´・ω・`)

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

2004年12月09日

GradientWeightmap1

↓のように選択したポイントから隣接するポイントにウエイトマップを広げていくプラグインを作る

fley.comでこういうプラグインを検索したら「GradientWeightmapCreater」 なるLScriptがあったけど、ちょっと違うので名前だけパクった。
↑のgifアニメを作ってるときに思ったのが、UVtoWeight使えば、割と簡単に似たような事が出来ますからぁ、残念っ!
けど他にネタが無いんで作ってみる、斬りぃっ!

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

2004年12月03日

簡易マッスルボーン3

EZMuscle

レイアウト アイテムアニメーション

参照:
ここで選択したボーンにマッスルボーンの先端がくっ付いているような動きをする

体積を保持:
ボーンが伸び縮みしたときに体積を保つ

AfterIK:
IK後に計算する

SetMuscle

モデラー コマンドシーケンス
スケルゴンにEZMuscleのパラメータを埋め込む
EZMuscleを適用したいスケルゴンを選択してSetMuscleを実行
EZMuscleの設定をしたスケルゴンはデフォルトでは濃い赤になります
参照ボーンはスケルゴン名で保存するので、スケルゴン名はかぶらないように付けてください

パラメータはEZMuscleを参照

 

ReadMuscle

レイアウト ジェネリックプラグイン
スケルゴンからパラメータを読み込み、EZMuscleを適用する
SkelegonReaderなどで予めスケルゴンをボーンに変換しておく
オブジェクトを選択してReadMuscleを実行
スケルゴン名とボーン名が変わっていると正常に実行できません(例えば、Boneというスケルゴンが複数あると、 ボーンに変換した時にBone(1)とかに変わってしまう)

 

EZMuscle [Intel] ダウンロード

ソースコード

 

簡易マッスルボーン2

変換マトリクス作成関数とEvaluate関数のコード

//ローカル→ワールド変換
LW_CMatrix_4x4 LtoW(LWItemID id, const LWItemInfo *iinfo, double time)
{
  LWItemID    parent;
  LW_CMatrix_4x4  mat;
  LWDVector    vec;
 
  mat.init();
  iinfo->param(id, LWIP_ROTATION, time, vec);
  mat.rotateHPB(vec[0], vec[1], vec[2]);
  iinfo->param(id, LWIP_POSITION, time, vec);
  mat.translate(vec[0], vec[1], vec[2]);
 
  parent = iinfo->parent(id);
  if( parent ){
    mat = mat * LtoW(parent, iinfo, time);
  }
 
  return mat;
}
//ワールド→ローカル変換
LW_CMatrix_4x4 WtoL(LWItemID id, const LWItemInfo *iinfo, double time)
{
  LWItemID    parent;
  LW_CMatrix_4x4  mat;
  LWDVector    vec;
  int        i;
 
  mat.init();
  iinfo->param(id, LWIP_POSITION, time, vec);
  for(i=0; i<3; i++) vec[i] *= -1;
  mat.translate(vec[0], vec[1], vec[2]);
 
  iinfo->param(id, LWIP_ROTATION, time, vec);
  for(i=0; i<3; i++) vec[i] *= -1;
  mat.rotateY(vec[0]);
  mat.rotateX(vec[1]);
  mat.rotateZ(vec[2]);
  parent = iinfo->parent(id);
  if( parent ){
    mat = WtoL(parent, iinfo, time) * mat;
  }
 
  return mat;
}

XCALL_(void) Evaluate(LWInstance inst, const LWItemMotionAccess *access)
{
  MyData      *data = (MyData*)inst;
  LWDVector    rot, scl, tip;
  double      length;
  LW_CMatrix_4x4  mat;
 
  *data->self = access->item;
  if( NULL == *data->reference ) return;
  memcpy(tip, data->refPos, sizeof(double)*3);
  //ローカル(reference)→ワールド
  mat = LtoW(*data->reference, data->iinfo, access->time);
  mat.Transform(tip);
#ifdef CHECK_VAL
  if( fp )
    fprintf(fp, CHECK_FORMAT, access->time, tip[0], tip[1], tip[2], "ローカル→ワールド");
#endif//CHECK_VAL
  //ワールド→ローカル(self)
  mat = WtoL(*data->self, data->iinfo, access->time);
  mat.Transform(tip);
#ifdef CHECK_VAL
  if( fp )
    fprintf(fp, CHECK_FORMAT, access->time, tip[0], tip[1], tip[2], "ワールド→ローカル");
#endif//CHECK_VAL
  access->getParam(LWIP_ROTATION, access->time, rot);
  mat.init();
  mat.rotateHPB(rot[0], rot[1], rot[2]);
  mat.Transform(tip);
  Angle(tip, rot);
  length = Distance(tip);
  access->getParam(LWIP_SCALING, access->time, scl);
  scl[2] = length / data->restLength;
  if( data->holdVolume ){
    scl[0] = scl[1] = sqrt(1/scl[2]);
  }
  access->setParam(LWIP_ROTATION, rot);
  access->setParam(LWIP_SCALING, scl);
}

LW_CMatrix_4x4は自作の変換マトリクスクラス
LtoWとWtoL関数は再帰的に呼び出して、Root(親が無い)に達すると戻ってくる
Rootに向かって行くときに自分自身の変換マトリクスを作っておいて、帰るときに掛け合わせている
ワールド→ローカルとローカル→ワールドでは移動、回転のかける順番が違う

 

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

広告


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

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

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


×

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