質問: 3次元空間上の2つの座標から角度を求めたい 3次元空間上の2つの座標、 座標a と 座標b から a -> b の角度を求めるにはどうしたらよいでしょうか? pythonでプログラムを組んでいるのですが調べてもイマイチ3次元での方法がわからなかったため質問しました。 多分座標aにオブジェクトがあると仮定した時、 そのオブジェクトを座標bに向けるというのと同じようなことをすればいいのではと考えて 調べているのですがわかりません。 2次元ではatanを利用すれば出来るようなのですが 3次元の方法がわからなかったため質問しました。 座標a:(xa, ya, za) 座標b:(xb, yb, zb) 求めたい結果:rotation(xr,yr,zr) 空間的には +x 左 +y 上 +z 正面 になっています。 pythonの方法でなくても言語などは問わないので分かる人教えて下さい。 よろしくお願いします。
回答: うーん、これは難しい。 > 3次元空間上の2つの座標、 座標a と 座標b から > a -> b の角度を求めるにはどうしたらよいでしょうか? 文面通り受け取るのなら、つまりベクトルaとベクトルbが「成す角度」を求めたいのなら、単に二次元と同じになります。 高校数学で習ったと思いますが、こういう場合は単に「内積」を使えばオーケーです。 つまり、ベクトルaとベクトルbが成す角度θは ベクトルa * ベクトルb = |ベクトルa||ベクトルb|*cosθ の関係にあるんで、 cosθ = ベクトルa * ベクトルb/ |ベクトルa||ベクトルb| だと高校数学では習います。 従って、 θ = arccos(ベクトルa * ベクトルb/ |ベクトルa||ベクトルb|) で「ベクトルaとベクトルbが成す"平面上"での角度」は自然に求めるわけですが、これが質問者さんが求めてるモノなのかどうか、ってのが分からないんですよねぇ。 ここではpython2.7.6を使いますが、取り敢えず、vectorってオブジェクトはpythonビルトインではなかった筈なんで、ベクトルの代わりにリストを用いますが、「上の論法で良いのなら」大体次のように計算します。 >>> import math # 数学ライブラリをインポート >>> a = [5, 5, 5] # ベクトルaの定義 >>> b = [10, 10, 10] # ベクトルbの定義 >>> dot_product = sum([i[0] * i[1] for i in zip(a, b)]) # ベクトルaとベクトルbの内積を求める >>> dot_product 150 # ベクトルaとベクトルbの内積。5×10+5×10+5×10になるからこれは正しい。 >>> abs_a = math.sqrt(sum(i**2 for i in a)) # ベクトルaの長さを求める >>> abs_a 8.660254037844387 # √(5^2+5^2+5^2) の答えと一致する >>> abs_b = math.sqrt(sum(i**2 for i in b)) #ベクトルbの長さを求める >>> abs_b 17.320508075688775 # √(10^2+10^2+10^2) の答えと一致する >>> angle = math.acos(dot_product/(abs_a * abs_b)) # θ = arccos(ベクトルa * ベクトルb/ |ベクトルa||ベクトルb|)を計算 >>> angle 2.1073424255447017e-08 # ベクトルaとベクトルbが成す角度