既知の長さの2つのベクトルu、v間の角度アルファは、それらの内側(内積)<u、v>から見つけることができます。
cos(alpha)= <u、v> /(|| u || || v ||)
つまり、アルファの正弦は、2つのベクトルの内積をそれらの長さの積で割ったものです。
したがって、3番目のzコンポーネントはゼロ以外の値にすることができます。角度を正しく取得した後で軸ベクトルの一部またはすべてをスケーリングしても角度は変わらないので、(たとえば)Cz=1と仮定しましょう。
ここで、最初の2つのベクトルはA =(1,0,0)およびB =(cos(gamma)、sin(gamma)、0)になる可能性があります。これらは両方とも長さが1であるため、Cを選択する際に満たす2つの条件は次のとおりです。
cos(alpha)= <B、C> / || C ||
cos(beta)= <A、C> / || C ||
これで、解決する未知数はCxとCyの2つだけになります。簡単にするために、これらをxおよびyと呼びます。つまり、C =(x、y、1)です。したがって:
cos(alpha)= [cos(gamma)* x + sin(gamma)* y] / sqrt(x ^ 2 + y ^ 2 + 1)
cos(beta)= x /(sqrt(x ^ 2 + y ^ 2 + 1)
最初の方程式を2番目の方程式で割ると(ベータが直角ではないと仮定します!)、次のようになります。
cos(alpha)/ cos(beta)= cos(gamma)+ sin(gamma)*(y / x)
これは、比率r = y/xを解くための線形方程式です。それができたら、上記の2番目の方程式にy = rxを代入し、2乗すると、xの2次方程式が得られます。
cos ^ 2(beta)*((1 + r ^ 2)x ^ 2 + 1)= x ^ 2
cos ^ 2(beta)=(1-cos ^ 2(beta)*(1 + r ^ 2))x ^ 2
x ^ 2 = cos ^ 2(beta)/ [(1-cos ^ 2(beta)*(1 + r ^ 2))]
方程式を二乗することにより、xの符号の選択に対応するアーティファクトルートを導入しました。したがって、「元の」2番目の方程式でこれから得られるxの解をチェックして、cos(beta)の正しい符号が得られることを確認します。
追加した:
ベータが直角の場合、物事は上記よりも簡単です。x = 0が強制され、yの最初の方程式を解くだけで済みます。
cos(alpha)= sin(gamma)* y / sqrt(y ^ 2 + 1)
分母を2乗して乗算すると、前に行ったのと同様に、yの2次式が得られます。yの記号の選択を確認することを忘れないでください:
cos ^ 2(alpha)*(y ^ 2 + 1)= sin ^ 2(gamma)* y ^ 2
cos ^ 2(alpha)= [sin ^ 2(gamma)-cos ^ 2(alpha)] * y ^ 2
y ^ 2 = cos ^ 2(alpha)/ [sin ^ 2(gamma)-cos ^ 2(alpha)]
実際、角度alpha、beta、gammaのいずれかが直角である場合、計算を簡略化するために、その角度gamma(最初の2つのベクトルA、Bの間)にラベルを付けるのが最適な場合があります。