スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

軸反転とかそういうの。

現在、全身のボーンをコントローラのみで操作していて、コントローラは位置情報のみしか持たせていない。
回転情報を含めたら全身でも10個くらいでコントロールできるかもしれない。

回転情報を持たせていない理由は後からモーションを弄るときに「軌跡」が目に見えないからだ。
XYZ軸における回転情報をグラフで見ることは可能だけれど分かりにくい気がする。

例えば首のボーンを制御するとして、

・首の位置と回転情報をもったコントローラがある

・首の位置情報と、どこを見ているかの位置情報がある


あとから編集してみると断然後者のほうが扱いやすかったのである。
(軌跡は3Dビュー窓で直接移動できるのも便利)


自作のコントローラが増えてきたときに姿勢を軸によって反転させたくなった。
しかしそんな機能が見当たらない。
そもそも名前も適当につけてあるし対称にして欲しくないものもある。

そんな時便利なのがCoffee機能やXpresso機能。
慣れてくるとC4DのCoffeeは今までのソフトで例を見ないほど便利に感じると思う。

汎用的なものを作るなら
・名前のルールを作ってLeftとRightに反応して位置を入れ替える
・単品のものは自身の位置を軸によって反転させる

といった感じのものになるとおもう。
自分用なら決まった名前を入れておいてスクリプトに登録してボタンに割り当てちゃえばOK。


ソースは長いので重要そうな部分だけ抜粋

//X軸反転
Xchange(name,doc)
{
var obj = doc->FindObject(name);
var m = obj->GetMg();
var pos = m->GetV0();
var v1 = m->GetV1();
var v2 = m->GetV2();
var v3 = m->GetV3();
var scl = vector(vlen(v1),vlen(v2),vlen(v3));
pos.x = -pos.x;
v.y = -v1.y;
v1.z = -v1.z;
v2.x = -v2.x;
v3.x = -v3.x;
m->SetV0(pos);
m->SetV1(vnorm(v1) * scl.x);
m->SetV2(vnorm(v2) * scl.y);
m->SetV3(vnorm(v3) * scl.z);
obj->SetMg(m);
}

後で見ても分かるように書いたけどどうかな・・・

V0は位置行列
V1~V3は回転拡大行列が入っている。

最初X軸に対して完全に対称なボーンを作成していたんだけど、よく考えたらそれだと姿勢が崩れてしまう。
そこで基底ベクトルのX軸要素をもう一度反転させる必要がでてくる。


ちなみに作成したコントローラに回転情報を持たせていないのなら上記のようなことも考えなくて済む。
  var obj = doc->FindObject(name);
var pos = obj->GetPosition();
pos.x = -pos.x;
obj->SetPosition(pos);


らくちん。


ねよっと。

コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。