3ds max to Worldtoolkit追記。
気をつけろ!3dsMaxから書き出したROTはそのままWorldtoolkitじゃ使えねぇや!
ex)3dsmaxからase形式で書き出したときのデータ
*CONTROL_ROT_SAMPLE 0 -0.000000 0.000000 1.000000 1.570796
前三つが回転軸。X,Y,Zの合成ベクトルで表している。それぞれ二乗して合計すると1になるよう正規化されている。
最後のがラジアン。この分だけ回転する。これを[a]としておく。
ex)WorldToolKitで使うデータ
Orie 0.000000 -0.707107 0.000000 0.707107
前三つが回転軸。だが3dsmaxのものとちがって sin(a/2)がかけられている。 X*sin(a/2)
一番最後は cos(a/2)。
畜生、道理でそのままつかえねーはずだ。
しかも3dsmax標準の座標は高さ軸が上に向かうZなのに対して、WTKは高さ軸が下に向かうYときやがる。
その辺を考慮してコンバータをつくらねーと駄目ですね。
それかもともとWTKの座標系にあわせて3dsmaxで作るか。それでもYとZの入れ替えは必要なんですよね。
あと、3dsmaxのラジアンは増加量。WTKのパスの方で必要なのは絶対量なので、直前までの値をもってきてごにょごにょしましょう。
にゃー。
2007年12月18日火曜日
あーあ、俺のドリルは回転しっぱなしだなぁ!!
2007年12月6日木曜日
あーあ、俺にファッションセンスとパッションセンスがあればなぁ!!
WTK覚書
3ds Maxで作った.3dsファイルをWorldToolKit(WTK)でloadする。
するとたまに3dsmaxで作ったはずの形とパーツがずれているときがある。
これの原因を探ったら基点の問題だった。
3dsMax上でミラーとかいろいろすると基点がモデルの真中にないときがあるので、基点を動かして調節することがある。しかし、WTKで読み込むときには最初の基点で表示するために、結果としてズレがでる。
これを回避するためには基点を動かして作業したあとに一度.objファイルに書き出して読み込めばいいんじゃないの。そうすればモデルの真中に基点が設定されたものができる。やったね。
べつにこんなことしなくても基点直せるよって人は教えてください。お願いします。
あ、これ3dsmaxの覚書なんじゃねぇの。
2007年12月3日月曜日
あーあ、俺も散弾銃のように歌い続けるかなぁ!!
World Tool Kit覚書
~ 3dsMaxで作った動きをWTK上でも再生しようぜ ~
1. 3dsMaxでてきとーにパス上を流れる動きを作成。
2. 書き出し -> ASCII形式を選択 -> なんかこのへんは忘れたけど精度6桁で出力
3. 出来た.ASEファイルを俺式コンバータ(後述)でWTK用の形式に変換
4. WTK上で動かすには「移動ノード」「モーションリンク」「パス」の三つを生成する必要がある。
4.1. 「パス」の生成。
WTpath *Path; /* パス */
WTgeometry *marker; /* マーカー用ジオメトリ */
path = WTpath_load("ファイル名.ASE",NULL);
/*** ついでにパス可視化 ***/
/* マーカー用box生成 -> パス可視化のためのマーカーセット -> マーカーを可視化 */
marker = WTgeometry_newblock(1.0,1.0,1.0,NULL);
WTpath_setmarker(Path,marker);
WTpath_setvisibility(Path,TRUE);
4.2. 「移動ノード」の生成
WTnode *Move; /* 移動ノード */
Move = WTmovnode_load(親ノード,"ファイル名.3DS",1.0);
4.3. 「モーションリンク」の生成
WTmotionlink *motion;
motion = WTmotionlink_new(Path,Move,WTSOURCE_PATH,WTTARGET_MOVABLE);
5. これで「移動ノード」->「モーションリンク」->「パス」の繋がりが完成したので、
WTpath_play(Path)で動かせばいいじゃん。
[俺式コンバータ概要]
3dsMaxから書き出したものは座標をPOSが入ってる文、回転をROTが入ってる文で記述してある。
ex)
*CONTROL_POS_SAMPLE 0 -6.839744 7.298635 -16.181553
*CONTROL_ROT_SAMPLE 160 -1.000000 0.000000 0.000000 0.000391
POSはX,Y,Zの三元、ROTは4元数である。
そんなこんなに気をつけて、SAMPLEのすぐ横の数字が同じPOSとROTを交互に配置すればいいじゃない。
ex)
POSI -6.839744 7.298635 -16.181553
ORIE -1.000000 0.000000 0.000000 0.000391
あとは……、一番頭になんか記述して、二行目に全部のPOSIとORIEの数を書くべし。
数値の間はタブから半角空白へ。POSIの後は半角スペース二つ。
とりあえずここまで。
追記 とんでもねー。このままじゃつかえねーよ。
2007年11月30日金曜日
あーあ、俺の脳にパッチあたんねぇかなぁ!!
Worldtool Kit修練
選択肢のジオメトリをクリックしたら次の状態に移る奴を作りたかったのでだらだらと作る。
マウス更新関数をつくればいいみたい。
static void mouse_phase1(WTsensor *sensor)
{
/*********************************
オリジナルマウス挙動関数
クリックしたものがどのジオメトリかを取得する
********************************/
long buttons; /* ボタン情報 */
FLAG lclick; /* 左クリックフラグ */
WTmouse_rawdata *raw; /* マウスXY座標値 */
WTp3 p; /* WTsensor_setrecod関数設定用 */
WTq q; /* WTsensor_setrecod関数設定用 */
float speed; /* センサー感度値 */
WTwindow *w; /* ウインドウオブジェクトポインタ */
int x,y,width,height; /* ウインドウ配置情報 */
//////////////////////////////////////////
WTpoly *clickpoly; /* クリックされたポリゴン */
WTp3 clickp3; /* なんかとりあえずいらねーかも */
WTgeometry *clickgeometry; /* クリックされたジオメトリ */
char clickgeoname[256]; /* クリックされたジオメトリの名前 */
//////////////////////////////////////////
WTp3_init(clickp3); /* 初期化 */
//////////////////////////////////////////
WTmouse_rawupdate(sensor); /* マウス新規情報を取得 */
w = WTmouse_whichwindow(sensor); /* マウスウインドウを取得 */
if(!w){
WTp3_init(p); WTq_init(q);
WTsensor_setrecord(sensor,p,q);
return;
}
WTwindow_getposition(w,&x,&y,&width,&height); /* ウインドウ配置情報を取得 */
raw = (WTmouse_rawdata *)WTsensor_getrawdata(sensor); /* ウインドウ座標系のマウス情報を取得 */
speed = WTsensor_getsensitivity(sensor); /* あーいらないかも */
buttons = WTsensor_getmiscdata(sensor); /* マウスのボタン情報をゲット */
/* 押されたか */
lclick = buttons & WTMOUSE_LEFTBUTTON; /* 左クリックON/OFF */
if(lclick){ /* 左クリックされてんの? */
clickpoly = WTscreen_pickpoly(0,raw->pos,NULL,clickp3); /* どのポリゴンクリックしたの? */
WTmessage( "X:%f Y:%f\n",clickpos[X],clickpos[Y] ); /* クリック座標表示 */
if(clickpoly != NULL){ /* クリックした場所にポリゴンがあるならば */
clickgeometry = WTpoly_getgeometry(clickpoly); /* ポリゴンからジオメトリを取得 */
strcpy(clickgeoname,WTgeometry_getname(clickgeometry)); /* ジオメトリの名前を取得 */
WTmessage( "geoname[%s]\n",clickgeoname); /* ジオメトリの名前を表示 */
if(strcmp(clickgeoname,"botton1") == 0){ /* botton1さんですか? */
/* A発動 */
WTmessage( "A\n");
}else if(strcmp(clickgeoname,"botton2") == 0){ /* botton2さんですか? */
/* B発動 */
WTmessage( "B\n");
}else{
/* 特に何もないです */
}
}
}
return;
}
予め「botton1」「botton2」という名前を付けたジオメトリを配置してある。
このマウス更新関数でジオメトリをクリックしたらAとかBとか表示されるものが出来た。
当然てきとーに作ってあるので品質に保証は出来ないし、
よくわかんねーで書いてある処理もあるので困る。
追記:returnを書き忘れる俺は死ぬべき