トップページ > 過去ログ > 記事閲覧
フレーム(ボーン)の回転値を得る方法
名前:タカトゥ 日時: 2012/06/10 00:25

フレーム(ボーン)の回転値を取得したいのですが可能でしょうか? ローカルのものではなくワールドのもの(といえばいいんでしょうか?)が取得したいです。

Page: 1 |

Re: フレーム(ボーン)の回転値を得る方法 ( No.1 )
名前:管理人 日時:2012/06/10 18:06

ワールド空間におけるフレームは行列という形で位置と回転情報を持っていて ワールド空間におけるフレームの回転値という情報はフレームは持っていないので単純には不可能です 具体的にはどのようなことをされたいのでしょうか?
Re: フレーム(ボーン)の回転値を得る方法 ( No.2 )
名前:タカトゥ 日時:2012/06/10 20:47

具体的には 3Dモデルで形成されたマップの切替時にキャラクターの移動先としてボーンを配置し、 そのボーンの向きをキャラクターが移動時に向いている方向にしようと思っています。 もう一つはエフェクトライブラリを使用してキャラクターのフレーム(ボーン)にエフェクトをアクセサリの様に設置したいと思っています。
Re: フレーム(ボーン)の回転値を得る方法 ( No.3 )
名前:管理人 日時:2012/06/11 01:32

なるほど、わかりました ボーンの向きといっても、ボーン自体には矢印で示せるような「向き」という情報はありませんので やるとしたら「キャラクターをボーンのZ軸の方向に向かせる」などになると思います XYZ各軸の向きを調べたい場合は、ボーン( DXライブラリで言うところのフレーム )の ローカル→ワールド行列を MV1GetFrameLocalWorldMatrix で取得して、その行列を使って XYZ軸の内の調べたい軸のみ 1.0f を代入してそれ以外の軸に 0.0f を代入したベクトルを VTransformSR で変換すれば、その結果からボーンの軸の向きが分かります 例:"BoneA" という名前のボーンのワールド空間でのZ軸の向きを取得する int FrameIndex ; MATRIX FrameLocalWorldMatrix ; VECTOR FrameZAxis ; // ボーンのフレーム番号を取得 FrameIndex = MV1SearchFrame( ModelHandle, "BoneA" ) ; // ボーンのローカル→ワールド行列を取得 FrameLocalWorldMatrix = MV1GetFrameLocalWorldMatrix( ModelHandle, Frameindex ) ; // Zだけ 1.0f を代入したベクトルを行列を使って変換 FrameZAxis = VTransformSR( VGet( 0.0f, 0.0f, 1.0f ), FrameLocalWorldMatrix ) ; 上記コードの FrameZAxis は「ベクトル」なので、たとえば良く使うY軸回転における 回転角度を求めたい、ということでしたら標準関数の atan2 を使うことでラジアン単位で 角度を取得することができます float Angle = atan2( FrameZAxis.x, FrameZAxis.z ) ; この方法でモデル中のボーンの向きにキャラクターを向かせる、ということができると思いますが 如何でしょうか?( ボーンの位置は MV1GetFramePosition で取得することができます )
Re: フレーム(ボーン)の回転値を得る方法 ( No.4 )
名前:takatwu 日時:2012/09/02 13:45

返信遅れて申し訳ありません。 試してみましたところ ボーンのローカル→ワールド行列を取得した行列の中身が常に 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 ? ? ? 1.0 となりボーンの向きの取得がうまくいきませんでした。 モデルはメタセコイアにKeynoteのプラグインを使用して作成したものを xファイルで出力しています。 MV1GetFramePositionで位置情報の取得はできているので、ボーンの指定は間違えていないはずです。 具体的にどのようなモデリングをすることでボーンの向きを取得できるのでしょうか?
Re: フレーム(ボーン)の回転値を得る方法 ( No.5 )
名前:管理人 日時:2012/09/09 07:57

行列の状態が載せて頂いた通りだとしますと、そのまま解釈すればボーンには座標の情報だけで 回転値は0ということになります > 具体的にどのようなモデリングをすることでボーンの向きを取得できるのでしょうか? そのご質問にお答えするには、まず私がtakatwuさんが何を「ボーンの向き」と認識されているのか知る必要があります もし不都合が無ければボーンの向きを取得したいという件のモデルファイルを拝見させていただけないでしょうか? よろしければ、お手数ですがこちらのメールアドレス BQE00322(あっとまーく)nifty.com (あっとまーく)を@に置き換えてください に送ってください m(_ _)m
Re: フレーム(ボーン)の回転値を得る方法 ( No.6 )
名前:takatwu 日時:2012/09/11 18:16

Yahooメールに障害があったので、無事に届いたか若干不安ですが モデルファイルを送信させていただきました。 補足として 「ボーンの向き」はボーンの先端方向のベクトルだと考えています。
Re: フレーム(ボーン)の回転値を得る方法 ( No.7 )
名前:管理人 日時:2012/09/15 21:11

メールありがとうございます、モデルを拝見しました 私もKeynoteを入れてサンプルモデル等を出力して少し調べてみたのですが、 Keynoteのボーンには回転値は入っていないようです そしてボーンの情報はxファイルに出力される際にボーンの付け根部分の座標だけ 出力されているようですので、xファイルからメタセコイア上で確認できるような ボーンの向きを取得することはできないようです ただ、子ボーンを持つボーンで、且つ子ボーンの付け根の位置が親ボーンの先端部分と 一致するボーンに限っては、子ボーンの位置と親ボーンの位置の差からボーンの向きを 取得できます なので、ボーンだけで向きを取得する場合は最低でも親と子の二つのボーンを作って、 親のボーンの位置と子のボーンの位置の差分から向きを取得する、といったことが 必要になりそうです
Re: フレーム(ボーン)の回転値を得る方法 ( No.8 )
名前:takatwu(解決) 日時:2012/09/15 23:59

ありがとうございます。 教えて頂いた方法で試したいと思います。

Page: 1 |