• ベストアンサー

3次元座標を複素数で表現するには

x + iy の形で2次元座標を表示することは分かりますが 複素数を用いて3次元空間の座標表示を行なうためには どのような方法を用いるのでしょうか。 高校生の数学知識で理解できるレベルでのご説明をお願いします。

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

  • ベストアンサー
回答No.3

> 空間上の物体を平行移動するのであれば、 これだけなら、ベクトルが便利です。 実際の3D-CGなんかだと、それに加えて回転の演算が必要になります。 x,y,z軸周りの回転で表現しようとすると、結構面倒になります。 2次元の複素数平面で複素数の積で回転が表せるのと同様に、4元数を導入すると計算量を圧倒的に削減できます。 > 3次元座標を画面に表示するのであれば、虚数を使わなくとも (x, y, z) だけで > どのようなアルゴリズムで4元数をお使いになられるのかを、 3D-CGに関してなら、前述したように入門書や解説サイトなんかがたくさんあるので、そちらを見る方が分かりやすいと思います。 その10 クォータニオンを学んでみよう! http://marupeke296.com/DXG_No10_Quaternion.html クォータニオン(四元数)による3次元座標回転計算: 意志あるところに道は開く      ~Where there is a will, there is a way.~ http://kiracchi-serendipity.sblo.jp/article/28543599.html

その他の回答 (3)

回答No.4

No2 です。すみません…あらためてみてみたところ寝ぼけていたのか式が変でした: > (α, β) = (√r exp(iφ/2) cos(θ/2), √r exp(iφ/2) cos(θ/2)), …(i) ではなく(これではα=βだ…)、  (α, β) = (√r exp(-iφ/2) cos(θ/2), √r exp(iφ/2) sin(θ/2)), …(i) です…。 ■(ついでに…) 回転の詳細 (A) 三次元の点を(x,y,z)で表している時、回転は  3×3の回転行列R を用いて表します。回転は行列をベクトルに適用することで実行できます: v → v' = R v。回転操作の合成 (=ある回転と別の回転を続けて行った時に全体としてどのような回転になるかを求める) は行列の積 R1 R2 で計算できます。 (B) 一方で、三次元の点を四元数 p=ix+jy+kz で表している時、回転は  単位四元数 q = cos(θ/2) + i・n sin(θ/2),   ただし i・n = i nx + j ny + k nz,   n = (nx, ny, nz) は回転軸の向きを表す単位ベクトル,   θ は回転の角度 で表すことができます。回転は p → p' = q p q^* と計算できます。回転操作の合成は四元数の積 q1 q2 で計算できます。 (C) 三次元の点をχ=(α,β)で表している時、回転は  2×2の複素行列 g = cos(θ/2) I + (σ・n) sin(θ/2),   ただし σ・n = σx nx + σy ny + σz nz,   σx = (0 1; 1 0), σy = (0 -i; i 0), σz = (1 0; 0 -1) は2×2行列   (※σx, σy, σz はパウリ行列(Pauli matrices)と呼ばれます) と書けます。回転は行列をかけて計算できます: χ → χ' = gχ。回転操作の合成は行列の積です: g1 g2。 ■3D-CGにおける利点について余談 割りとどうでもよい話なので読み飛ばして頂いて構いません。3D-CG の場合はNo3の仰る通り計算が速い(足し算・掛け算の回数が少なくて済む)ということが四元数の主な利点だとは思いますが、数値誤差を制御するのが楽だからという話も聞いたことがあります。 3D-CG ではモデルの移動・回転、カメラの移動・回転をいろいろに組み合わせるので「回転操作の合成 」を何度も行う必要性があります。ところで、計算機は無限の桁を扱うことはできないので、計算の過程で適当なところで四捨五入をして計算を行います。何度も回転を合成する際に、四捨五入によって生まれるずれが累積しないように調整する必要があるのですが、それが四元数だと楽ということです。 つまり、3×3行列が回転行列になっているためには、  Rは直交行列(行列の各列ベクトルの長さが1で、かつ互いに直交する) という条件を満たさなければなりません。また、四元数についても  qは単位四元数 (ノルムが1) という条件を満たさなければなりません (よく考えたら、実は回転を p' = qpq⁻¹ とするならこの条件考えなくても良いかも…)。これらの条件は本来は回転操作の合成をしてもちゃんと満たされたままのはずなのですが、計算機の四捨五入によって微妙なずれが生じます。ずれが蓄積すると、モデルが勝手に拡大されたり、ひしゃげた様な形に変形してしまったりするので、ずれを補正する必要があります。 ずれを補正する問題は、  ある与えられた行列に一番近い直交行列を探す または  ある与えられた四元数に一番近い単位四元数を探す という問題に帰着されます。一番近い単位四元数を求めるのは簡単で、単に与えられた四元数を規格化すれば良いだけです: つまり q → q' = q/|q|。一方で「与えられた行列に一番近い直交行列」を求めるのはかなり面倒です。そういう意味で四元数による回転の表現の方が好まれるという側面もあるかと思います。 あとは、四元数の方が見た目に「回転軸」や「回転量」がわかりやすく直感的に扱いやすいという利点(?)もあるかもしれません。回転行列Rの成分を見せられても、それがどういう回転なのか頭の中に思い浮かべるのは難しいです…。計算機にとっては直感も何もないのでそんなの関係ないのかもしれませんが。

回答No.2

なんでも良いのであれば例えば複素数2つを持ってきて (x+iy, z) などとすればOKです…がこれだと数学的な性質からいって余り便利ではありません。便利なものとして、よくやるのは "SU(2) の基本表現(spin-1/2 representation)"だとか No1さんの言及された四元数(quaternion …でもこれは複素数ではない)による表現だとかでしょうか。といいつつこれらの表現は、2次元座標を x+iy と表現するときほどには万能ではなく、限られた議論(回転だとか)のときにだけ用いられます。 ★SU(2) の基本表現は複素数2つのペアで、3次元座標との対応は次のようにします:  (α, β) = (√r exp(iφ/2) cos(θ/2), √r exp(iφ/2) cos(θ/2)), …(i) ただし (r, θ, φ) は3次元空間座標 (x, y, z) = (r sinθ sinφ, r sinθ cosφ, r cosθ) の極座標表示です。 逆に α, β から r, θ, φ や x, y, z を求めるには、  r = |α|²+|β|², φ = arg(β/α), cosθ = (|α|²-|β|²)/(|α|²+|β|²),  x = Re[2α^* β], y = Im[2α^* β], z = |α|²-|β|² の様にできます(Re, Im は実部・虚部です。α^* は複素共役です)。因みに |α|²+|β|²=1 のとき、量子力学のスピン波動関数の観点から、(x,y,z) を "状態 (α, β) に対応するブロッホベクトル(Bloch vector)" といいます。 あと注意しておかなければならないことは、(α, β) と (exp(iξ) α, exp(iξ) β), (ξは任意定数) は空間的に同じ点を表していると考えることでしょうか。つまり、(i) で示した (α, β)は一例に過ぎず、実は空間の各点に対応する (α, β) は無数にあって、それらは定数倍exp(iξ)の違いがあるということです。 この表現がどう便利なのかについては面倒なので割愛しますが、回転操作を考えるときにすっきりした形で書けるということだけ言っておきます(他にも利点はあるかもしれませんがそんなに詳しくないので…)。 ★これらの 3次元実数・2次元複素数・1次元四元数の関係は、回転群のリー代数(Lie algebra)の対応  so(3) = su(2) = sp(1) から理解されます。実のところどれも本質的には同じなので、素直に3次元座標は実数3つで表しておくのが一番良いです(だいたいの場合)。

回答No.1

物理とか3D-CGの世界だと、クォータニオンを使うのが一般的です。 Wikipediaの説明か、ハミルトンの話が分かりやすいかも。 四元数 - Wikipedia https://ja.wikipedia.org/wiki/%E5%9B%9B%E5%85%83%E6%95%B0 ウィリアム・ローワン・ハミルトン - Wikipedia https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%83%AA%E3%82%A2%E3%83%A0%E3%83%BB%E3%83%AD%E3%83%BC%E3%83%AF%E3%83%B3%E3%83%BB%E3%83%8F%E3%83%9F%E3%83%AB%E3%83%88%E3%83%B3 > 高校生の数学知識で理解できるレベルでのご説明をお願いします。 ん~、難しい。 というか、多分質問者さんが「小学生に複素数を」って説明を求められるくらいにめんどくさいし、説明しても理解してもらえるって自信がない。 分かりやすい情報を収集しようとしても、3D-CG入門なんかでの説明が大量に出てきて探しにくいし。 「x + iy + jz」とかで何で上手く行かねーんだコンチクショー!って悩んだ末に問題解決に辿り着いた、ハミルトン関係のエピソードなんか読んでみるのが良いかも。 ウィリアム・ローワン・ハミルトンとは (ウィリアムローワンハミルトンとは) [単語記事] - ニコニコ大百科 http://dic.nicovideo.jp/a/%E3%82%A6%E3%82%A3%E3%83%AA%E3%82%A2%E3%83%A0%E3%83%BB%E3%83%AD%E3%83%BC%E3%83%AF%E3%83%B3%E3%83%BB%E3%83%8F%E3%83%9F%E3%83%AB%E3%83%88%E3%83%B3 3Dアニメーションの原点は、ダブリンの橋に刻まれた数式 « WIRED.jp http://wired.jp/2002/11/01/3d%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%8E%9F%E7%82%B9%E3%81%AF%E3%80%81%E3%83%80%E3%83%96%E3%83%AA%E3%83%B3%E3%81%AE%E6%A9%8B%E3%81%AB%E5%88%BB%E3%81%BE%E3%82%8C/ Amazon.co.jp: 天才の栄光と挫折―数学者列伝 (文春文庫): 藤原 正彦: 本 http://www.amazon.co.jp/%E5%A4%A9%E6%89%8D%E3%81%AE%E6%A0%84%E5%85%89%E3%81%A8%E6%8C%AB%E6%8A%98%E2%80%95%E6%95%B0%E5%AD%A6%E8%80%85%E5%88%97%E4%BC%9D-%E6%96%87%E6%98%A5%E6%96%87%E5%BA%AB-%E8%97%A4%E5%8E%9F-%E6%AD%A3%E5%BD%A6/dp/4167749025 Amazon.co.jp: 数学をつくった人びと〈2〉 (ハヤカワ文庫NF―数理を愉しむシリーズ): E.T. ベル, Eric Temple Bell, 田中 勇, 銀林 浩: 本 http://www.amazon.co.jp/dp/toc/4150502846/ref=dp_toc?_encoding=UTF8&n=465392

mqm
質問者

補足

ご親切な解説をいただき、とてもためになりました。 ハミルトンが10年もかかって4元数を発見したことが分かりました。 まだ疑問が解けずにいることがあります。 3D-CGの世界で、なぜ4元数が登場するのか、 その理由をお教えいただけますでしょうか。 3次元座標を画面に表示するのであれば、虚数を使わなくとも (x, y, z) だけで 表現できるように思うのですが、 どのようなアルゴリズムで4元数をお使いになられるのかを、 大学初級程度の数学の知識で教えていただければ助かります。 空間上の物体を平行移動するのであれば、 (x, y, z) から (x+a, y+b, z+c) への移動は、ベクトルの足し算でできると思いますので なぜ4元数が出てくるのか、まだ分かりません。 時間表記を3次元座標に加えるために、4次元の計算が登場することになるのでしょうか。 よろしくお願いします。 .