• ベストアンサー

DirectX3D クォータニオンについて

(うまく説明できないのですが・・・) DirectX3Dである物体(たとえばロボット)の向き(ロボットの正面方向)をクォータニオンで管理しています。 そのクォータニオンの値を元に、ロボットの足から頭の頂点へむかうベクトルを求めるにはどうしたらよいのでしょうか? 例えばXZ平面が地面を表すとして、地面に対して直立しているなら(0,1,0)となるベクトルを求めたいです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#168973
noname#168973
回答No.2

#1です。こんばんは。 なるほど、大体お考えの事は判りました。私は少し勘違いしていたようです^^) それで、もう解決なさったのなら余計な事になるかも知れませんが、クォータニオン(ちょっとタイプしにくいので以後「四元数」と書きますね^^)について少しだけ補足を... お返事の中で回転するために四元数から回転行列に変換して演算すると仰ってられますが、実は回転の演算だけなら四元数のまま演算を行うほうがコストはかかりません。むしろ低コストで回転演算をするために行列より四元数を使うと言っても良い位だそうです。 ある文献によると、3×3行列で回転演算しようとすれば27回の積和演算が必要なのに対して、四元数だと16回の積和演算で済むそうです(それに移動も一緒に扱おうと思えば行列では4×4行列が必要になるのでもっと多くのコストがかかります)。 ただ、実を言うと私も四元数は最近知ったばかりです^^) そのため、あまり偉そうな事は言えません。 でも、最初に知った時は衝撃的だったので最近色々調べている最中です。 ちなみに「四元数 回転 共役」でググると良さそうなページが見つかったので、参考URLに記しておきます。 よろしかったらご参考にしてください。

参考URL:
http://staff.aist.go.jp/toru-nakata/quaternion.html
ss_yama
質問者

お礼

いろいろご丁寧にありがとうございました。 3Dのプログラミングをしていて、自分の線形代数の理解の乏しさを嘆いているところです。 また何かありましたら質問させていただきます。

その他の回答 (1)

noname#168973
noname#168973
回答No.1

こんにちわ。 「向きをクォータニオンで管理..」とは具体的にどのようになんでしょうか? DirectX3D での定義があるのかも知れませんが、DirectX3D は殆ど知らないもので、的を外しているかも知れませんが少々... 例えば q = w + xi + yj + zk の w を常に 0 か 1 として残る x,y,z で実質三次元のベクトルとしてその向きをロボットの正面方向と見なすと仮定して話をさせてもらいますと、多分、ご希望のベクトルは求まらないのではないかと思います。 ご希望のベクトルを求めるには、もう1本のベクトルが定義される必要があると思います。 間違ってらゴメンなさい^^)

ss_yama
質問者

お礼

すいません。よく考えたら簡単な話でした。 クォータニオンを使って回転行列を作ることができるので、基準となるベクトル(0,1,0)をその回転行列を使って回転すればいいだけですね。 お騒がせしました。

ss_yama
質問者

補足

ありがとうございます。 (クォータニオン自体を最近知ったので理解がおかしいかもしれませんが)xyzが回転軸でwが回転量になってます。 で、描画のときはそのクォータニオンを回転行列に変換して回転させています。 回転処理自体はそのやり方でうまくいっているのですが、今どの方向を向いているのかをベクトルとして知りたいのですが、クォータニオンの理解が乏しく行き詰まっている状態です。

関連するQ&A

  • ベクトルの回転について

     左手系の空間において、一人の人がxz平面に立ち、上(y>=0)を見上げている状況を想定して下さい。  それを向きとして3次元ベクトルで値を持っている場合、その人の頭が伸びている直上方向のベクトルを計算で求めるにはどのように計算すればよろしいでしょうか? クォータニオンを勉強し始めていて、そういうのでできそうだなとは思うんですが、どうでしょうか……。

  • 今DirectXでゲームを作っているのですが、どうしても実装できないこ

    今DirectXでゲームを作っているのですが、どうしても実装できないことがあります。 マウスカーソルの近くにある物体をスピードを落としながら話していくという仕様なのですが、ベクトルを使っての実装ができません。どうかわかる方がいましたら回答お願いします。 pV1.x;//マウスカーソルのx座標 pV1.y;//マウスカーソルのy座標 pV2.x;//物体のx座標 pV2.y;//物体のy座標 pOut1.x;//物体のx座標からマウスカーソルのx座標を引いた値 pOut1.y;//物体のy座標からマウスカーソルのy座標を引いた値 D3DXVec2Subtract(&pOut1,&pV2,&pV1);//pV2ベクトルからpV1ベクトルを引いてpOut1に格納する float VecLength=D3DXVec2Length(&pOut1);//pOut1ベクトルの大きさをVecLengthに格納する vecPosition.x=/*ここがわかりません*/ vecPosition.y=/*ここがわかりません*/

  • ベクトルの外積が右ネジの方向を向く理由は?

    ベクトルの外積の向きが、2つのベクトルが作る平面に対して垂直(右ネジの方向を向く)なる理由は、何故でしょうか? 行列で、証明出来るのでしょうか? 行列が苦手なので、行列式を見てもイマイチイメージが出来ません。 ローレンツ力から、ベクトルの外積の向きは、平面に対して垂直となると、定義づけをしていまっているのでしょうか? 宜しくお願い致します。

  • 値の代入をしたいだけなのに

    あるベクトル型クラスがあるんですが、 例えば物体Aの向きを、他の物体Bの向きを元に指定する場合、このベクトルを使って、 vDirectionA = vDirectionB.Rotation(90); //vDirectionBの回転ベクトルを代入 とすると、vDirectionB.Rotation(90)の値が代入されると共に、なぜか物体Bそのものが90度回転してしまい困っています。代入の方法が間違っているのでしょうか。ご教授お願いします。

  • 空間図形です。

    『xy平面上で、原点をとおりx軸とのなす角がθ=π/8の直線を考え、この直線上に点Aをとります。 原点を一つの頂点として、この直線とその法線を2辺とする直角二等辺三角形OABを、この直線を軸にして回転させます。 線分OBがxz平面上にあるとき、この線分がx軸となす角の大きさを求めてください。』 ・・・円錐の底面の円とxz平面の交点とか、ベクトルならどうかとか、いろいろ考えたのですが、全然ワケがわからなくなってしまいました。 直線や円、球など各種方程式も、言われれば「そんなのもあったな・・・」程度にまで忘れています。使いこなせてません。 助けてください。 よろしくお願いします。

  • 小惑星探査機MINERVA

    ほとんど円柱形の箱のような形をしているMINERVAは車輪でも脚でもなく、内部のトルカの反力によってローバ全体を地面とは垂直に(ローバ全体の角運動量ベクトルが地面と平行になるように)回転させ、地面を蹴って水平方向の推力を得ると聞きますが、この「反力」とはどのような原理で生じるものなのでしょうか?また、身近にも同じような原理で動いているものはあるのでしょうか? (補足:某書物中にある図を見てみますと、トルカの回る向きとローバ全体が回る向きが反対になるように描かれていました。)

  • この問題の解き方がよくわかりません。教えてください!

    この問題の解き方がよくわかりません。教えてください! [問題]地面から高さh の所から質量m の物体を水平方向に速度v0 で投げた。物体は速度v に比例する抵抗力- mγ ? v (γ > 0 )を受ける。 (1) 水平方向をx 方向、鉛直上向きをy 軸の正方向として、物体の速度ベクトル(vx ,vy ) を、投げてからの時間t の関数として求めよ。 (2) 十分時間がたったときの物体の速度ベクトル(vx ,vy ) を求めよ。

  • 倒立振子について

    二足歩行ロボットに興味があったので勉強していましたが、 『三次元線形倒立振子』という言葉がよくわかりません。 普通の倒立振子は振子の頂点が平面に弧を描くように頂点でバランスを保とうとしていると思うので二次元にあたるのかな?と考えていますが (正面から見て、xy軸のような。違っていたらスイマセン) 三次元ってどんな意味?何の事?みたいな感じです。 三次元倒立振子についての知識がある人や、こうだと思うという考えがある方、また詳しい文献をご存知の方回答をよろしくお願いします。

  • 物理とは縁の無い一般人ですが・・

    とある直方体の物体があるとします。 この物体を地面の上で水平方向に前後に連続して動かす場合に、 この物体が、地面に対して水平か垂直か、また前方に対して縦向きか横向きかなど、 向きや角度によって物体にかかる抵抗といいますか、 動かすのに必要な力というのは違うのでしょうか? また違う場合どのように違うのでしょうか? なるべく専門用語無しでお教え頂けると幸いです。 またこういったことを計算する方程式などがあれば、その存在だけでも教え頂けると有り難いです、 宜しくお願い致します。

  • ベクトル解析の方向微分係数について

    たとえば、xyz=1でA(1,1,1)とします。 Aにおける(1,2、3)方向の方向微分係数を求める。 f=xyz-1とおく gradf=(yz,xz,xy) Aを代入(1,1,1) よって、法線ベクトルが求まりました。 (1,1,1)・(1,2,3)とすればいいのですよね? しかし、例えばf=1-xyzとおくと 法線ベクトルが(-1、-1、-1)となり、 方向微分係数のが違う値になります。 xyz=1をどちら移項すればいいのか分かりません。 どなたか教えてください。

専門家に質問してみよう