在宅ワークのリアルをベテランとビギナーにインタビュー>>

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の方法でなくても言語などは問わないので分かる人教えて下さい。
よろしくお願いします。

gooドクター

A 回答 (3件)

あなたが期待しているのは、どんな結果なのですか?


「これで近い向きにはなっていますがやはりずれています」とは、どんな方法で確認したものなのでしょうか?


A(5,5,5) から B(10,10,10)への角度は
B-A=(10-5,10-5,10-5) = (5,5,5) のベクトルと並行な角度になります。
角度をこのままX,Y,Z座標で表す方法もあります。
大きさで割った 単位ベクトル を角度として使用することもあります。

平面なら角度は1つで済みますが、立体では2つ必要です。
X-Y平面上でどの向きかを示す「方位角」 と 上下にどのくらいかの「仰角」の組合せはよく使われます。

(5,5,5)ベクトルの方位角は45度、仰角は35.26...度 で、合ってます。



何に使ってるかわかりませんが、Vector3D[0]が方位角、Vector3D[2]に仰角、って使い方が間違っているということは無いですか?
    • good
    • 1
この回答へのお礼

ありがとうございます!
方位角と仰角を正しく理解していなかったみたいです。
方位角と仰角について調べたところ思った結果が得られるようになりました!

お礼日時:2016/04/28 09:57

うーん、これは難しい。



> 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が成す角度
    • good
    • 0
この回答へのお礼

回答有り難うございます。
自分の説明が下手ですいません。
2つのベクトルの角度を求めたいわけではありません。

お礼日時:2016/04/28 09:51

C言語でよろしければ、こちらのQ&Aで回答があります。


http://dixq.net/forum/viewtopic.php?f=3&t=12318
    • good
    • 0
この回答へのお礼

vec1 = Vector3d(5, 5, 5)
vec2 = Vector3d(10, 10, 10)

rot = Vector3d(0, 0, 0)

rot[0] = atan2( vec2[0] - vec1[0], vec2[2] - vec1[2] )
rot[2] = -atan2(vec2[1]-vec1[1], sqrt(pow(vec2[2]-vec1[2], 2)+pow(vec2[0]-vec1[0], 2)))

print rot
print (degrees(rot[0]), degrees(rot[1]), degrees(rot[2]))

結果:
FBVector3d(0.785398, 0, -0.61548)
(45.0, 0.0, -35.264389682754654)

記述してみました。
実行はできました。
これで近い向きにはなっていますがやはりずれています。
ちなみにこの結果は正しいんでしょうか?
何かミスがあれば指摘お願いします。

お礼日時:2016/04/27 18:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング