自力で思いついたクォータニオン(四元数)の操作方法を説明しようぜ☆(^~^)
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

自力で思いついたクォータニオン(四元数)の操作方法を説明しようぜ☆(^~^)

2018-01-10 23:44
    前の記事 「複素数の回転をインド式掛け算改で説明しようぜ☆(^~^)」
    http://ch.nicovideo.jp/kifuwarabe/blomaga/ar1404371



    ────────────────────────────────────────
    ここは冒頭


    「 ウォルフラム というWebサイトで クォータニオンを
    計算できることが分かったので、 本文を始める前に 冒頭を追加して 少し遊ぶぜ☆」


    ウォルフラム
    https://www.wolframalpha.com/input/?i=quaternion:+0%2B0.86i%2B0.5j-0.43k






    「 天面から見て、時計回りに回転させるなら、
    数学の複素平面は 反時計回り なんで、時計回り方向はマイナスだぜ☆
    垂直軸は k軸 なんで kをー90°回転させたいぜ☆
    cos は 0、 sin は -1 かだぜ☆
    じゃあ k は -1 だな☆ -1k☆
    Re軸 を 0 にすると 180°回転してしまったので、1 と入れておこう☆」
    「 Re軸が 回転に なんの影響を与えるんだぜ☆?」
    「 i、j、k軸だけ使うのではなく、
    Re,i,j,k の4軸全部使って 計算してるのかもしらん☆」




    「 k軸を 反時計回りに90° 回したいときは
    sin 1 にするというのは 感覚に合っているぜ☆」
    「 じゃあ 立てるなら x軸を 反時計回りに90°回せばいいのか☆?
    1i かだぜ☆?」



    「 合ってるな☆」
    「 ドア・ノブ回転 も試してみましょう。
    寝かしたRを 時計回りに90°回してちょうだい」
    「 y軸は 手前から奥に走っているので、奥を天面と考えて
    複素平面の回転方向に回せば 反時計回り になるぜ☆ 符号はプラスで 90°かだぜ☆
    sin 1 にすればいいから 1j だろう☆」



    「 よしよし☆ いけてるぜ☆」
    「 じゃあ そのドア・ノブ・ターンして立てたR、
    こっちに向けてよ」
    「 すでに j軸 を回してしまっているので、ここで k軸を回すと
    軸が ナナメに傾いて回転してしまう☆
    1回のターンで 思っている向きに 寝返ることができるような、
    1本の回転軸 を見つけなければならないぜ☆」




    「 回転は i軸、j軸、k軸 の比なんで、
    0+1i+1j+1k でも、
    0+2i+2j+2k でも、
    おなじ結果になるぜ☆
    比 を作らなければならないぜ☆」



    「 その調子で 軸を こんな感じに 動かしたいんだが☆」
    「 j軸を+1、 k軸をー2 するような比は 無いのかだぜ☆?」
    「 k軸を -2 しても 180°回転 にはならないぜ☆」



    「 90°+45° といった感じだぜ☆
    この先 どんどん半分半分になっていく感じ☆」



    「 じゃあ k軸に でかい数字 を入れれば けっこう 回るわよ」
    「 180°回すのに なんでそんなマジックナンバーを
    入れなければならないのか……☆」



    「 x軸とk軸を 大きく ひねると ドア・ノブ・ターンから
    こっちを向いたが☆」
    「 直観と反するぜ☆」



    「 この図を見てほしい☆
    x が 4 のとき y が 2 になっていることから、
    x軸 を 基準として y軸、z軸 の直線が 決まるのかもしれないぜ☆」
    「 そんな作りにしてるのか……☆」




    「 じゃあ x軸を 0 に固定して
    y軸と z軸を 同じにすれば 45° の坂道になるが、
    ちゅうぶらりんの 赤いR の向きの説明には なってないぜ☆」
    「 青い点線に 回転軸 としての意味は 無いんじゃないの?」
    「 要らない表示だよな☆」



    「 Re軸を0にしても 青い点線は そのままで
    赤いR の向きが変わったぜ☆」
    「 青い点線 意味ないな☆」
    「 x軸がj軸、 y軸がi軸 になってるんじゃないか☆?
    逆だと思うんだぜ☆」
    「 逆になっていると思いながら 操作すればいいじゃない。
    逆立ちのR を作ってよ」



    「 頭を90°向こうに倒すだけだぜ☆
    これは x軸(i軸)をひねれば いけるんだが☆」
    「 2軸を同時に動かすと 意味合いが変わってくるのでは☆?」




    「 0.1 ずつ起き上がらせているときは 感覚に合うぜ☆」
    「 2軸同時に動かすと 2倍大きく動くんじゃないか☆?」
    「 クォータニオンを どう使うかは ソフトによって変わるのかだぜ☆?
    うーむ☆」




    ─────────────────────────────────────────
    ここから本文







    「 わたしは 積分、ベクトル、行列演算 の勉強をしなかったんで
    自力で 十六元数まで行ったんで
    これから 自力で思いついた クォータニオンの操作方法を 説明するぜ☆」
    「 ふつうは思いつかないのよ」
    「 まあ 行ける方法で行けだぜ☆」




    「 ぐるんぐるん回転させることになるんで、
    座標軸は 右手系か 左手系に しておくのが説明しやすいんだぜ☆

    どっちでもいいんだが、とりあえず わたしは 右手系 に統一するぜ☆
    x、y、z の代わりに i、j、k を使う☆

    右手はこっちを向いていて、
    向かって右の方、上の方、手前が 正の方向になる☆」

    「 この右手の形は 親指と 人差し指の 向きを決めると、
    中指の位置が 1つに定まる☆
    親指 × 人差し指 = 中指
    という式になっている☆
    例えば i × j = k になる☆」



    「 j × k = i になるし☆」




    「 k × i = j になるぜ☆」



    「 親指を j、 人差し指を i という風に逆にすると
    中指は 逆の方向、 つまり マイナスの方向を向くな☆
    j × i = -K
    これが 逆順だぜ☆
    掛け算の順序を 逆にすると 回転方向が k→j→i になるのを見ていこう☆」




    「 k × j = -i だぜ☆」



    「 i × k = -j だぜ☆」

    「 i × i のように 親指と 人差し指が
    同じ方向を指すケースは どうするんだぜ☆?」

    「 この図には描いていない Re(リアル)軸 の方で位置が動く☆
    i × i、
    または -i × -i なら Re軸を負の方へ、
    i × -i または
    -i × i なら Re軸を正の方へ☆
    3次元の回転では Re軸へ倒すことはないし、
    用事が無ければ Re軸は 無視しろだぜ☆ 用事がある例は あとで説明する☆」




    「 そして 軸 には ねじれ の方向があると思っておけだぜ☆
    覚え方としては、 円を池に見立てれば
    めだか が 反時計回りに ぴょんぴょん 飛んでる感じだぜ☆」



    「 ここで プラクティス(実践練習)だぜ☆
    i=3 にある赤い玉を 90°回転させて j=3 に持っていく方法を
    考えようぜ☆」
    「 sin(サイン)を1、 cos(コサイン)を0 で
    掛け算すればいいんじゃないの?」

    「 三角比を すらすら使って 話せるのは 楽だな……☆
    二元数の複素数では cos 90 + i sin 90、
    別の書き方で (0+1i) と書けばいいのだった☆
    前回の記事を読めば 話しについてこれるだろう☆」

    「 二元数の複素数では
    Re(リアル)軸が x に、
    Im(イマジナリー)軸が y に対応していたから
    cos は Re軸 に、
    sin は Im軸 に 対応づけることができたが、
    クォータニオンでは i軸、j軸、k軸 があるんだぜ☆ どう対応づけるんだぜ☆?」

    「 そこが機転だぜ☆
    2軸使うと1軸余るのと、マイナスが 逆順を意味していることを利用すると
    うまいこと パズルピースは揃っている☆」



    「 k軸を逆回転させる、という気持ちを込めて
    -1k を掛けようぜ☆」
    「 それは sin(サイン)なの? cos(コサイン)なの?」

    「 右手系で 反時計回りは k軸の逆回転、
    という上図をそのまんま 保持しながら 見てもらっていいぜ☆
    sin(サイン) だぜ☆」

    「 では、前回のブログでやったように、
    インド式掛け算(改)で 筆算してみようぜ☆」





    「 二元数の複素数のときは 4マスだったが、
    四元数の複素数のときは 16マスになるぜ☆」





    「 0に 何掛けても 0 なので、 0の入っている列は無視すればいい☆
    今回の場合、掛け算を行うのは 1マス だけだぜ☆」





    「 3i × -1k = -3ik だぜ☆
    アルファベットは 掛けた順に並べろだぜ☆
    これを間違えると 回転方向が変わってしまう☆
    -3ki と -3ik は別物だからな☆ 順番には一番注意しろだぜ☆」



    「 ところで i × k は -j を指していたよな☆」



    「 ik は -j に変わる☆
    -3 と -j を掛けて 3j だぜ☆
    このように アルファベット、 数学的には元(げん)とか
    element(エレメント)と言うが、
    元が何個付いていても、
    右手を1回1回 順番に注意して 向きを進めていくことで、
    Re、i、j、k のどれかの元に 必ず おさまるわけだぜ☆」
    「 90° 回転したわね~」

    「 sin だけでは 90° ずつしか回せないだろう☆
    30° 回すには どうするんだぜ☆?
    回転には sinと cos の両方が必要だろ☆」




    「 赤い玉 が i軸 に刺さっていることを 思い出してほしい☆
    i軸 からみて回転すれば 高さ を表す sin と重なるのは j 軸だぜ☆」



    「 それに比べて 横幅を表す cos は、
    赤玉の刺さっている i軸 と重なってしまう☆

    赤玉は 地上から見た雲 とでも思ってくれだぜ☆
    i という方向を向いて、 i という方向に回転しろ、と指示するのは
    無理なんだぜ☆ そのような場合……☆」

    「 この図にはない Re軸 の方に回転する、ということにしておこうぜ☆
    ちょうどいい具合に、超複素数の空間には 使い道のない Re軸 が余っていて
    無理な回転のときに 利用できるんだぜ☆」

    「 人間が勝手に無理と思ってるだけで、
    複素平面や、虚数単位は ”無い” ところを ”有る” ことにした世界だから

    足りないものは足りている、
    そのように創られているのが 二元数、四元数、八元数、十六元数 の空間だぜ☆」



    「 なんにしろ Re(リアル)軸 を使えばいいのね。
    Re軸 は どっち回りに ねじれているの?」
    「 ねじれていない☆
    i軸と Re軸は 沿っていると考えていい☆」
    「 複素平面では Re軸 と Im 軸は 交差していたじゃないか☆
    クォータニオンでは なんで Re軸 と Im 軸は 同じ方向を向いているんだぜ☆?」
    「 同じ方向は向いていないが、
    1、i、-1、-i という順に並べているので
    べつに 正負の方向は ひねっているわけでもなく、独立しているだけだぜ☆」




    「 何を 掛けたらいいか、なんだが、
    ねじることを考えろだぜ☆
    k軸を逆にねじって、i軸は ねじれないんで Re軸を ねじるんだぜ☆」
    「 どれぐらい 掛けるかは、
    ピタゴラスの定理 で出せだぜ☆
    横幅は cos、 縦幅は sin を見ろだぜ☆」
    「 簡単に言う☆」
    「 でも インド式掛け算(改) の表を見ると
    i軸に いい感じに 0.86 が掛かりそうね」
    「 インド式掛け算(改) は 見ての通り 掛け算のすべての組み合わせに
    対応可能☆
    あとは ねじりたい角度に応じて、 対応する列を きちんと選べるかどうか だけだぜ☆」




    「 はい、 i=3 の赤玉を 30° 回転させた答えが出たぜ☆
    (0+2.58i+1.5j+0k) だぜ☆」

    「 確かに 掛け算 だけで 3D回転 できているけど、
    どの軸を どっち回しにねじればいいのか、
    瞬時に判断できなくない?」

    「 セデ二オン(十六元数)なんか
    15軸+Re軸 も つまみ があるんだぜ☆
    クォータニオン(四元数)の3軸+Re軸ぐらい ちょちょいの ちょい だろ☆」



    「 ちなみに ロックがかかる……、つまり 軸が ねじれないケースは
    対角線に 一直線状に並んでいる☆
    こんな場合 Re軸 の方に倒せだぜ☆」
    「 Re軸 は つねに ロックがかかっているが……☆」
    「 Re軸は ねじれない☆
    自然数とか 整数とか 実数とか、あいつらがいる数直線だぜ☆」




    「 j軸に刺さっている 緑玉 を手前に30° 倒すのも
    どの つまみ を ねじればいいか さえ分かれば サイン・コサインでOKだぜ☆」
    「 それに加えて i軸方向にも 30° ねじるには どうすればいいの?」

    「 k軸方向に ねじるのと、 i軸方向に ねじるのを
    2回に分けるのが基本だが、
    クォータニオンのいいところは、
    どんな方向に曲げるのでも 1回 でできる という原理だぜ☆
    いくつのステップでも、掛け算で合成すれば 1ステップにできる☆
    そのため、どう 角度をつけるのにも 経路が何通りかある☆」



    「 ただし、正しく回転できるのは ピタゴラスの定理 に
    はまっていて、
    Re軸^2 + i軸^2 + j軸^2 + k軸^2 = ぴったり1
    になるときだけだぜ☆」
    「 ピタゴラスの定理で 四角形を 3つも 4つも増やしていいのかだぜ☆?」「 入れ子になっているんだぜ☆」



    「 ピタゴラスの定理に出てくる 2つの平方 もまた、
    ピタゴラスの定理で作られると考えれば、
    このあと、
    4つが 8つ、
    8つが 16個、
    と 何が起こるか 類推できるだろ☆」
    「 じゃあ (0+0i+2.58j+1.5k) を
    ピタゴラスの定理 に 当てはめることができるのかだぜ☆?」
    「 (0^2 + 0^2 + 2.58^2 + 1.5^2) で
    4つの四辺形の面積が
    (0 + 0 + 6.6564 + 2.25)
    と出るので、いったん 斜辺の四辺形 8.9064平方 を出して、
    この斜辺の四辺形を 1 にすればいいわけだから、
    四辺形の面積を 8.9064 で割ってやれだぜ☆」
    「 (0 + 0 + 0.7473 + 0.2526)
    になれば いい感じだぜ☆
    三角比はその名の通り 比 なのだから、 これで回せる☆」


    「 ブログを書くのが大変なので、すでに計算した例を再利用しようぜ☆」



    「 i軸上の3にある赤玉を j軸方向に 30° 回転させた緑玉を……☆」



    「 j軸上にある緑玉を k軸方向に30° 回転させる動きと
    合成しようぜ☆
    (0 + 0i + 2.58j + 1.5k) は
    およそ
    (0 + 0i + 0.7473j + 0.2526k)
    になることは さっきやった☆」

    「 それって
    (0 + 0i + 0.75j + 0.25k)
    って ことよね。
    0.75 と 0.25 は、 30° 回転させる ピタゴラス数と同じじゃない」
    「 まあ、クォータニオンで出てくる答えは すべて回転であり、
    球の表面上を移動する点Pでもあり、
    回転はすべて 比 で表されるからな☆
    半径1 に スケールを調整すれば ピタゴラス数になるだろう、
    回転の話しをしているこのブログの空気を読まずに 拡大 とかいった操作を
    入れていなければ☆」
    「 ただし、見落としがあるので
    合成を始める前に 説明する☆」






    「 で、 クォータニオン というのは 計算結果 なんで、
    回転したあとの位置 だぜ☆
    例えば i=3 を k軸について-90° 回転させて j=3 になったとしよう☆
    この j=3 という答え、 つまり 3j を 掛け算に使うと、

    i=3 をk軸について -90° 回転させろ、という意味ではなく、
    j軸を 90° 回して 3倍拡大しろ、
    になってしまう☆」
    「 困ったわねぇ」
    「 i=3を k軸について -90° 回転させろ、というのは
    (3i)(-1k)=(-3)(ik)=-3(-j)=3j
    と表現、また計算するが、

    j=3というのは i軸の1から動いた、 掛け算を逆順に書くと
    (3j)(1i)=(3)(ji)=3(-ij)=3(-k)=-3k☆」



    「-3k といのは
    i=1 を k軸について -90° 回転させて 3倍しろ、
    あるいは
    i=-3 を k軸について 90° 回転させろ、
    あるいは
    i=-1 を k軸について 90° 回転させて 3倍しろ、
    といった意味になるぜ☆

    結果的に いずれも
    i=3 を k軸について -90° 回転させろ、という意味になるぜ☆」

    「 1つの数字も いろんな経路があるのね~」
    「 区別できない☆
    合成したら 複数の動きの 最短距離を走ると思えだぜ☆
    経路を 区別したかったら 1ステップずつ 分解するしかない☆」
    「 並行移動したかったのに、3倍 という余計な操作が
    付いているじゃないか☆」
    「 最初に i=3 だっただろ☆
    3倍 という初期状態も 合成された☆」
    「 初期状態も 合成されるのは 困ったわねぇ」
    「 動きを合成したかったら、原点から始めろだぜ☆」
    「 原点で回転しても ずっと 0 で 寝返りをうってるだけで
    面白くないじゃないか☆」
    「 Re軸を1、
    i,j,k軸をそれぞれ 0 から始めれば無害☆
    めんどくさければ i軸だけ1 にして 他を0にしておいてから始めても無害☆」
    「 i=1 からスタートして、
    k軸を -30°、
    i軸を ー30° ひねって、赤玉を 手前に倒しましょう」



    「 絵で どうやって描けばいいか分からないが、
    半径1の球を想定して、その表面をスライドするように
    手前の方に 玉を持ってこようというわけだぜ☆」
    「 30° の高さに上げるsinは 0.5 だろう☆
    cosは およそ0.86☆

    sinの方は -0.5k、-0.5i でいいんじゃないか☆?」
    「 sinを合成してみろだぜ☆」
    「 (-0.5k)(-0.5i)
     = (-0.5×-0.5)(ki)
     = (0.25)(-ik)
     = (0.25)(-(-j))
     = (0.25)(j)
     = 0.25j」
    「 j軸は それぐらいかもしれないけど、
    i軸と k軸 はどうすんの?
    cos(コサイン)だけじゃ足りないんじゃないの?」
    「 cos なんか 世界を 90° 寝かせただけのサインだろ☆
    cosを使わず 世界を任意の方向に寝かせて
    全部 sin(サイン) でやってみろだぜ☆」





    「 想像以上に 脳に負担がかかるぜ☆
    水色、赤 の矢印の順に sin を求めればいいんだろ☆
    しかし どこを sin で求めればいいのか 見えない……☆」
    「 物事を多角的に考えろ、とか 定型文しかしゃべらない大人がいたら
    クォータニオンを やらせようぜ☆
    セドニオンをやれば 物事を 35個 の方向から考えよう、とは やすやす と
    言わなくなるだろう☆」
    「 ラーメン屋の二郎の大盛を食べなければ 大盛を食べたことには
    ならないというような 極端な考え方は 止めなさい!」



    「 30° 回転したあとに 30° 回転しても、
    思ったような 真ん中の方には 回転していないな☆
    2ステップ目の回転は 小さな半径の円を 回っている☆」
    「 そうそう……☆
    1回 1回 の回転は 軸回転 なんで☆
    中心を軸とした点回転 ではないので 回転半径は変わるんだぜ☆」

    「 ちょっと 遠回り してから 回るのが コツ みたいな
    職人芸 が必要なのだったら、クォータニオンは 使いにくいわよ?」
    「 本来 行きたかった先が i、j、k でいうと どこか、を
    あらかじめ 知っていれば 逆算 して
    何度 進めば そこに行けるのかは 出せるが……☆」





    「 sin(サイン)というのは radius(ラディウス,半径)との
    比 で表される高さだった☆」



    「 これは 球 になっても同じ☆
    床になる桃色の面と、ラディウスの長さと その角度 を 定めてしまえば
    どっちを向いていても sin は同じ☆」
    「 桃色の面は どうやって定めるの?」




    「 高さを計りたい軸 を1つ定めれば、
    残りの2軸が 平面 を表すぜ☆

    i軸の長さを sin で求めたければ、
    j軸でも k軸でも どちらを ひねっても いけるぜ☆」




    「 sin(サイン)を求めるために 別の軸を回すというのは
    すっきりしないな☆
    cos(コサイン)でやってみようぜ☆?」




    「 cosでやってみても 0.86、 0.43、 0.5
    の組みは 変わらね☆」
    「 ( 0 + 0.86i + 0.43j + 0.5k )
    かだぜ☆ なんとなく説得力のある数字だぜ☆

    だったら 回転角は cos で求めるかだぜ☆?」
    「 正解は 何なの?」
    「 計算機とか無いんで、検証するしかないぜ☆」




    「 ピタゴラス数 が合っていないが☆」
    「 比 なんで、斜辺に隣接する四辺形の面積が 1.1745 なら
    それ以外の四辺形の面積も 1.1745 で割ってやれば ピタゴラス数 になるだろ☆」

    「 とりあえず
    ( 0 + 0.86i + 0.43j + 0.5k )
    が合っているものとして 話しを進めるぜ☆」

    「 i=1 の位置に赤玉があるとき、
    ( 0 + 0.86i + 0.43j + 0.5k )
    の場所に 一発で進める掛け算 を作れる数字を 算出してみようぜ☆」




    「 インド式掛け算(改) に欲しい答えを埋め込んで、
    そのような数字になる i、j、k を考えてみようぜ☆」





    「( 0.86 + 0i + 0.5j -0.43k )

    だな☆」

    「 アルファベットとか、 プラスマイナスが ややこしいんだけど」




    「 アルファベットは 縦に並ぶようにしてあるんで……☆
    むずかしいのは 正負の符号 の方だぜ☆」



    「 水色は プラス、 オレンジ色は マイナス だと思ってくれだぜ☆
    Re(リアル)軸は 1 としよう☆
    1 に何を掛けても 符号は変わらないので ひし形の左辺は 水色 で埋まっている☆

    また、i×i=-i という定義から、真ん中の水平部分は マイナスで横一列に
    なっている☆」
    「 水色の矢印 1、 2、 3 は
    1 … i×j、
    2 … j×k、
    3 … k×i
    を表していて、正順なので プラスだぜ☆」
    「 オレンジ色の矢印 1、 2、 3 は
    1 … i×k、
    2 … k×j、
    3 … j×i
    を表していて、逆順なので マイナスだぜ☆」
    「 正負の符号の並びは むずかしいのね~」

    「 クォータニオンの プラス・マイナス は 進行方向 なんで、
    マイナスにしてから掛け算すれば 何を掛けたのか を逆算できるぜ☆
    やってみよう☆」



    「 マイナスして掛けるだけで いいんだ」


    ウォルフラム
    https://www.wolframalpha.com/input/?i=quaternion:+0%2B0.86i%2B0.5j-0.43k

    「 ウォルフラムで計算してもらったが、何か間違えたかだぜ☆?」


    https://www.wolframalpha.com/input/?i=quaternion:+1%2B0.86i%2B0.5j-0.43k

    「 Re軸を1にすると 結果が大きく変わるぜ☆」
    「 うーむ☆ 軸回転が 90°を超える動きをすると
    思っていない動きをするのかだぜ☆?

    掛け算を用いた回転の合成も すっきりしないぜ☆」
    「 さらなる調査が必要だな☆」

    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。