2009-01-13
変なソフトほぼ完成!
今更あけました、おめでとうございます。
つ、疲れました。正月まったりしすぎたせいもあり更新されずにここまで来てしまいました。
今日からは去年のような更新になると思いいなぁ(汗)
さてさて、実装を頑張っていたのですが、1週間で終わらせるるもりが1週間半かかりまだ完成していません。
というもののほぼ完成したのでインターフェイスをアップしておきます。

っう。
過去の記事を読んだ人はこれを見てつっこみたいことでしょう。
「これ動的読み込みできてる?」と。
・・・・
実は当初は関節に色を塗ったテープを張りいろいろ試行錯誤しておりました。
このように↓

しかしながら「安いカメラ」のせいで色がしっかりとれないのです!
2500円で済ませようとした私のせいもあるのでしょうが。。。
どっちにしろ体に隠れた部分はクリックして点を入れさせる仕様にする予定だったのでサックリ仕様変更して自分で全部の点をいれるように作り変えました。
ここまで作る必要があったのかどうか悩むところですが、キャプチャがない状態で3D空間でモデルをこねくり回すのもナンセンス。後々の作業効率を考えると多分ありだと思いたいです。
人形は以前トイザラスで購入したアクションフィギュア「ミクロマン」は名前の通り小さすぎたので、デッサンでよく使われるというボークスというメーカーのフィギュアを購入してみました。稼動が非常に多く満足しています。
ここまでくると二枚の画像を撮影しながら溜め込んでいき、後からそれを見ながら姿勢情報をクリックしてモーションを加えていき、最後にMakeBVHをぽちっとなという機能がほしくなります。
ということであとは2枚の画像を保存していく機能とインターフェイスを作成したら完成です。
以下は実装に伴って躓いた部分やソースでっす!
とりあえずクォータニオンをオイラー角に直すには、
クォータニオン→行列→オイラーの手順を踏みます。
//クォータニオン→オイラー(ZXY回転)
Vector3 QtoE(Quaternion q)
{
Vector3 v = Vector3.Zero;
Matrix m = Matrix.CreateFromQuaternion(q);
if (m.M32 == 1)
{
v.X = MathHelper.PiOver2;
v.Y = 0;
v.Z = MathHelper.ToDegrees((float)Math.Atan2(m.M21, m.M11));
}
else if (m.M32 == -1)
{
v.X = -MathHelper.PiOver2;
v.Y = 0;
v.Z = MathHelper.ToDegrees((float)Math.Atan2(m.M21, m.M11));
}
else
{
v.X = MathHelper.ToDegrees((float)Math.Asin(m.M32));
v.Z = MathHelper.ToDegrees((float)Math.Atan2(-m.M12, m.M22));
v.Y = MathHelper.ToDegrees((float)Math.Atan2(-m.M31, m.M33));
}
return v;
}
通常のフォームEXEでXNAの画面を表示するときは
public partial class GraphicsDeviceControl : Control
などとしてコントロールを作成するとよいようです。
そもそもイベントというものをきちんと扱ったことがなかったためにその辺の勉強から始まり、9割予想で作成したという驚愕のソフトです。
ラジオボタンのチェックが変わったら周りの黒いアクティブカーソルが切り替わるだけの操作を作るのに2時間とかかかりました。
一番はまったのがここです。
str_MOTION += WriteEuler.Y + " ";
str_MOTION += WriteEuler.X + " ";
str_MOTION += WriteEuler.Z + " ";
モーションの文字列を作成する際に記載するオイラー角の順がZ-X-Yオーダーの場合↑のようになります。
これのせいで1日潰れたと思います。
あと、クォータニオンから求めたオイラー角の符号を座標系によって変えなきゃいけない気がします。
あとは。。っあ!
BVHのローカル座標の作り方はどこかのサイトに「ボーンの向いている方向がZ軸に沿う」と書いてありましたが、違うようです。DirectXのローカル座標が沿うというサイトもあったので多分そっちが正解なのかもしれません。
初期姿勢がワールド座標と同等の座標系を持ち、そこから各々の回転によりローカル座標が決まります。
オフセットがどの方向であろうと初期姿勢の座標系はすべて同じです。
BVHのボーン関係は書き出すと(間違った情報が)ありえない量になると思うので割愛します。
ここにきて、とりあえずBVHは書き出せたのに肝心のエルフレイナで読み込めないではないか・・
エルフレイナのBVH読み込みはまだβ版らしく不具合があるという情報もあったのでサポートのほうに問い合わせてみることにした。
エルフレイナ作者の対応は本当に早くて親切なのでいつも助かっていたりします。
明日からモデリングも同時に進行できたらいいな。。。。
ねよっと。
つ、疲れました。正月まったりしすぎたせいもあり更新されずにここまで来てしまいました。
今日からは去年のような更新になると思いいなぁ(汗)
さてさて、実装を頑張っていたのですが、1週間で終わらせるるもりが1週間半かかりまだ完成していません。
というもののほぼ完成したのでインターフェイスをアップしておきます。

っう。
過去の記事を読んだ人はこれを見てつっこみたいことでしょう。
「これ動的読み込みできてる?」と。
・・・・
実は当初は関節に色を塗ったテープを張りいろいろ試行錯誤しておりました。
このように↓

しかしながら「安いカメラ」のせいで色がしっかりとれないのです!
2500円で済ませようとした私のせいもあるのでしょうが。。。
どっちにしろ体に隠れた部分はクリックして点を入れさせる仕様にする予定だったのでサックリ仕様変更して自分で全部の点をいれるように作り変えました。
ここまで作る必要があったのかどうか悩むところですが、キャプチャがない状態で3D空間でモデルをこねくり回すのもナンセンス。後々の作業効率を考えると多分ありだと思いたいです。
人形は以前トイザラスで購入したアクションフィギュア「ミクロマン」は名前の通り小さすぎたので、デッサンでよく使われるというボークスというメーカーのフィギュアを購入してみました。稼動が非常に多く満足しています。
ここまでくると二枚の画像を撮影しながら溜め込んでいき、後からそれを見ながら姿勢情報をクリックしてモーションを加えていき、最後にMakeBVHをぽちっとなという機能がほしくなります。
ということであとは2枚の画像を保存していく機能とインターフェイスを作成したら完成です。
以下は実装に伴って躓いた部分やソースでっす!
とりあえずクォータニオンをオイラー角に直すには、
クォータニオン→行列→オイラーの手順を踏みます。
//クォータニオン→オイラー(ZXY回転)
Vector3 QtoE(Quaternion q)
{
Vector3 v = Vector3.Zero;
Matrix m = Matrix.CreateFromQuaternion(q);
if (m.M32 == 1)
{
v.X = MathHelper.PiOver2;
v.Y = 0;
v.Z = MathHelper.ToDegrees((float)Math.Atan2(m.M21, m.M11));
}
else if (m.M32 == -1)
{
v.X = -MathHelper.PiOver2;
v.Y = 0;
v.Z = MathHelper.ToDegrees((float)Math.Atan2(m.M21, m.M11));
}
else
{
v.X = MathHelper.ToDegrees((float)Math.Asin(m.M32));
v.Z = MathHelper.ToDegrees((float)Math.Atan2(-m.M12, m.M22));
v.Y = MathHelper.ToDegrees((float)Math.Atan2(-m.M31, m.M33));
}
return v;
}
通常のフォームEXEでXNAの画面を表示するときは
public partial class GraphicsDeviceControl : Control
などとしてコントロールを作成するとよいようです。
そもそもイベントというものをきちんと扱ったことがなかったためにその辺の勉強から始まり、9割予想で作成したという驚愕のソフトです。
ラジオボタンのチェックが変わったら周りの黒いアクティブカーソルが切り替わるだけの操作を作るのに2時間とかかかりました。
一番はまったのがここです。
str_MOTION += WriteEuler.Y + " ";
str_MOTION += WriteEuler.X + " ";
str_MOTION += WriteEuler.Z + " ";
モーションの文字列を作成する際に記載するオイラー角の順がZ-X-Yオーダーの場合↑のようになります。
これのせいで1日潰れたと思います。
あと、クォータニオンから求めたオイラー角の符号を座標系によって変えなきゃいけない気がします。
あとは。。っあ!
BVHのローカル座標の作り方はどこかのサイトに「ボーンの向いている方向がZ軸に沿う」と書いてありましたが、違うようです。DirectXのローカル座標が沿うというサイトもあったので多分そっちが正解なのかもしれません。
初期姿勢がワールド座標と同等の座標系を持ち、そこから各々の回転によりローカル座標が決まります。
オフセットがどの方向であろうと初期姿勢の座標系はすべて同じです。
BVHのボーン関係は書き出すと(間違った情報が)ありえない量になると思うので割愛します。
ここにきて、とりあえずBVHは書き出せたのに肝心のエルフレイナで読み込めないではないか・・
エルフレイナのBVH読み込みはまだβ版らしく不具合があるという情報もあったのでサポートのほうに問い合わせてみることにした。
エルフレイナ作者の対応は本当に早くて親切なのでいつも助かっていたりします。
明日からモデリングも同時に進行できたらいいな。。。。
ねよっと。

