プロが教えるわが家の防犯対策術!

空間上にある点A(x,y,z)をX,Y,Zを基準として(θx、θy、θz)で回転させます。この回転でできた点をBとします。
そのBを同じ様にX,Y,Zで回転させて元へ戻したい場合、
X,Y,Zの順番で回転させているので、
戻すにはZ,Y,Xの順番に回転させればB=Aとなると思います。
tanや内積などを使い、回転角度を考えその角度で回転させることを考えました。
しかし、tanを用いた場合も内積で考えた場合も多少誤差が生じます。(θx=60度になるはずが、計算すると57度になったりする)

正しく回転角度(θx、θy、θz)を求めたい場合はどうすればいいのでしょうか?


一応回転の式はグラフィックス関係の本から調べました。
また自分でθx、θy、θzを入力した場合A=Bとなるので、
式は問題ないと考えています。

現状ではBを逆回転する際のθzを
tan(√(Bx^2+By^2)/√(Bz^2))=θz

Z軸逆回転したものをB'とすればθyは
tan(√(Bx'^2+Bz'^2)/√(By'^2))=θy

さらにY軸逆回転したものをB~とすればθyは
tan(√(By~^2+Bz~^2)/√(Bx~'^2))=θx


となりこれで求める事ができると考えています。


内積で考えた場合は内積の式からcosθを求め、acos(cosθ)で求めています。

長々とすみませんが、よろしくお願いします。

教えて!goo グレード

A 回答 (4件)

4×4行列を使って回転や平行移動の座標変換が出来ます。


逆行列を求めて同じ側から逆にかけてやれば、元に戻せます。

参考URLに詳しく載っています。
X,Y,Z軸の順に回転移動する行列もその順にかけてやれば
[x,y,z]・A・B・C=(x,y,z)・M=[x1,y1,y2]
M=A・B・C
AはX軸の周りの回転行列、BはY軸の周りの回転行列、
CはZ軸の周りの回転行列
とすれば、Mは一気に3軸の周りの回転を行う行列になります。
[x1,y1,z1]は回転移動後の座標です。

逆にMの逆行列N=M^-1を[x1,y1,z1]にかけてやれば元の座標に戻す事が出来ます。
[x,y,z]=[x1,y1,z1]・N
また、A,B,Cの逆行列をD=A^-1,E=B^-1,F=C^-1とおけば
N=M^-1=F・E・Dの関係にあります。つまり、
[x,y,z]=[x1,y1,z1]・N=[x1,y1,z1]・F・E・D
という関係にあると言うことですね。

逆順に逆行列を掛けてやれば元の座標が得られますは、
一回一回逆行列を求める手間を省くには
M=A・B・C
を求めておいて、その逆行列N
N=M^-1
を移動後の点の座標行列(座標ベクトル)に掛けてやれば元に戻せるという事ですね。

[x,y,z]=[x1,y1,z1]・N
の計算で正確に元に戻せますよ。

僕はこの行列演算をMapleなどの数式処理ソフトを使ってやっていますが、すぐに座標変換がすぐ出てきます。
三次元プロットすると移動の過程も確認できます。

参考URL:http://www.ceres.dti.ne.jp/~ykuroda/oyaj/bone/ba …

この回答への補足

info22 様

ご回答ありがとうございます。
そうですね、確かにその方法で行えば元に戻ると考えています。
しかしその際に必要なsin・cosのθ(回転する角度)が
分かっていると実行できると思うのですが・・・(もしかして私は勘違いしてるのでしょうか?)

たとえば、[x,y,z]を A(θx=30°) B(θy=45°) C(θz=60°)で回転させてできた[x1,y1,z1]を
F(A^-1),E(B^-1),D(C^-1) の順番にかけて[x,y,z]とする際に必要な回転角度θが
分からないとなると、計算して求めないといけないと思います。
そのθを求める方法がどう考えてもわからないのです。

それともθは関係なく、Mの逆行列であるN(M^-1)で求められるのでしょうか?
数式処理ソフトなどを使わずにプログラミング(C言語)で計算したいのです。
回転の式(これは理解しました)と角度を求める式(???)
が分かればプログラムを書く事はできるのですが・・・。

補足日時:2007/12/12 21:04
    • good
    • 0

> Mを求めると


> [cosθy*socθz     cosθy*sinθz     -sinθy]
> [sinθx*sinθy*cosθz-cosθx*sinθz     sinθx*sinθy*sinθz+cosθx*cosθy     sinθx*cosθy]
>[cosθx*sinθy*cosθz+sinθx*sinθz     cosθx*sinθy*sinθz-sinθx*cosθz     cosθx*cosθy]

の2行2列要素に転記ミスがありますので確認下さい。
sinθx*sinθy*sinθz+cosθx*cosθz

> このθx,θy,θzがそれぞれ同じ場合はできると思いますが、
>バラバラな場合の一度に戻るイメージがどうしてもわきません。
イメージがわかなければ具体的な分かりやすいケースを幾通りか当てはめて確認するのが良いと思います。

僕は点(x,y,z)のベクトルをA#1の参考URLにあるようにベクトル(x,y,z,1)にして4行4列の行列で扱って確認していますが、平行移動が伴わない場合は、A#1~A#3で扱っているように点ベクトルを(x,y,z),回転行列を3行3列で扱って構わないでしょう。

なお、行列A,B,C,D,E,F,M,Nの行列式の値は全て1になります。
    • good
    • 0

補足はこのサイトだけでなく、ネット上のGoogle他、多数の検索エンジンから検索がかかりますので、このサイトだけで使っている、このサイトのニックネームが公開されてしまいますので、解答欄や補足の中にニックネームを書かないことが常識のマナーです。

これから私だけでなく、他の回答者のニックネームは書き込まないようにして下さい。指定する場合はNo1さんとか、#2
さんのA#2の回答中…のように引用下さい。

本題に帰って、A#1の参考URLの中の各軸の周りの回転行列の逆行列を求めていただけば、元の回転行列のθを「-θ」に下だけのものになりますし、平行移動の行列の逆行列も移動量がマイナスになるだけです。

あえて計算で出すなら、回転角θ'の逆行列Fと元の回転の行列Aの回転角θとして、行列要素を全て等しいとおけば、
-sinθ'=sinθ、cosθ'=cosθ
という関係式が出てきます。これを満たすθ'は
θ'=-θ
という結果が出てくるだけです。
難しい式を解かないと出てこないという先入観をお持ちではないでしょうか?

この回答への補足

ANo.3様

ご回答ありがとうございます。
まず、ニックネームについて大変申し訳ございません。
自分の事ばかり先行し、気付けていませんでした。
これからこのような事が決してない様にします。
本当にすみませんでした。


本題なのですが、

[x,y,z]・A・B・C=(x,y,z)・M=[x1,y1,y2]

とした場合でも(θA、θB、θCはそれぞればらばらです)

[x,y,z]=[x1,y1,z1]・N

N=(F・E・D)


Mを求めると
[cosθy*socθz     cosθy*sinθz     -sinθy]
[sinθx*sinθy*cosθz-cosθx*sinθz     sinθx*sinθy*sinθz+cosθx*cosθy     sinθx*cosθy]
[cosθx*sinθy*cosθz+sinθx*sinθz     cosθx*sinθy*sinθz-sinθx*cosθz     cosθx*cosθy]
となると思います。
このθx,θy,θzがそれぞれ同じ場合はできると思いますが、
バラバラな場合の一度に戻るイメージがどうしてもわきません。

補足日時:2007/12/13 02:10
    • good
    • 0

#1です。



>たとえば、[x,y,z]を A(θx=30°) B(θy=45°) C(θz=60°)で
>回転させてできた[x1,y1,z1]を
>F(A^-1),E(B^-1),D(C^-1) の順番にかけて[x,y,z]とする際に必要
>な回転角度θが
> 分からないとなると、計算して求めないといけないと思います。
> そのθを求める方法がどう考えてもわからないのです。
角度はマイナスをつけてD(θz=-60°),E(θy=-45°),F(θx=-30°)
の順にすれば良いですね。符号が変わるだけで求める必要ないですね。
ちゃんと逆行列を計算すれば分かる事です。解答を読むだけでなく少しは手を動かして逆行列を計算してみてください。(#そうすればつまらない質問をしたりしなくて済みますよ。)

> それともθは関係なく、Mの逆行列であるN(M^-1)で求められるのでしょうか?
勿論、求まります。

> 数式処理ソフトなどを使わずにプログラミング(C言語)で計算したいのです。
> 回転の式(これは理解しました)と角度を求める式(???)
> が分かればプログラムを書く事はできるのですが・・・。

角度はマイナスの符号をつけるだけですから角度を求める式は
あえて言えば
θ'=-θ
ですね。

この回答への補足

info22 様

続けてご回答ありがとうございます。

言い方がおかしかったようで、すみません。
今は回転の式や手順を理解するために、自分で各θの値を入れて計算しています。

最終的には

A=[x,y,z]
B=[x1,y1,z1]

この2つの点があるとします。
この点Bを平行移動や回転をして、点Aと同じ場所に持ってきたいと考えています。
(AとBの各成分がイコールとなり、空間上で重ねたいです。)
となると、各回転角度(θ)は入力していないため(わからないため)、計算して求めないといけないと思います。

そこで回転角度となる各θを求める方法について質問させていただきました。
回答者様のおっしゃるとおり、同じ各θで逆回転させれば、プログラムでもエクセルでもまったく同じ座標を求める事

ができることは以前からわかっています。

ですので、[x,y,z]を A(θx) B(θy) C(θz)で回転させできた[x',y',z']を
逆回転となるD(-θx) ,E(-θy),F(-θz)の各θを計算により求めることができればいいのですが・・・。

補足日時:2007/12/12 23:52
    • good
    • 0

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

教えて!goo グレード

人気Q&Aランキング