私は座標sys Aに平面があり、その上に一連の点が既にあるようなことをしています。空間 N にも法線ベクトルがあります。基になる平面が N と同じ法線方向になるように、座標系 A のポイントを回転するにはどうすればよいですか?
これを行う方法について誰かが良い考えを持っているかどうか疑問に思っています。ありがとう
ポイントが現在ある平面の法線ベクトルを持っているか、簡単に計算できる場合、これを行う最も簡単な方法は、2 つの平面に共通の軸を中心に回転させることだと思います。これが私がそれについて行く方法です:
M
を現在の平面に垂直なベクトルN
にし、回転先の平面に垂直なベクトルにします。M == N
今すぐやめて、元のポイントをそのままにしておくことができれば。回転角度を次のように計算します。
costheta = dot(M,N)/(norm(M)*norm(N))
として回転軸を計算します
axis = unitcross(M, N)
ここunitcross
で、 は外積を実行し、それを単位ベクトルに正規化する関数、つまりunitcross(a, b) = cross(a, b) / norm(cross(a, b))
です。user1318499がコメントで指摘したように、実装が when を返さない限り、このステップは if の場合にエラーを引き起こす可能性M == N
がありunitcross
ます。(0,0,0)
a == b
軸と角度から回転行列を次のように計算します。
c = costheta
s = sqrt(1-c*c)
C = 1-c
rmat = matrix([ x*x*C+c x*y*C-z*s x*z*C+y*s ],
[ y*x*C+z*s y*y*C+c y*z*C-x*s ]
[ z*x*C-y*s z*y*C+x*s z*z*C+c ])
ここx
で、、、y
およびz
は のコンポーネントですaxis
。この式はウィキペディアに記載されています。
各点について、新しい平面上の対応する点を次のように計算します。
newpoint = dot(rmat, point)
ここで、関数dot
は行列乗算を実行します。
もちろん、これはユニークなことではありません。M
ピータークの答えで述べたように、 に垂直な平面をに垂直な平面に変換する可能性のある回転は無限にありますN
。これは、上記の手順を実行した後、平面を の周りN
で回転させることができるという事実に対応しており、ポイントは同じ平面にとどまりながら別の場所に配置されます。(言い換えれば、あなたの条件を満足させることができる各回転は、上記の手順を実行した後に を中心に別の回転を行うことに対応しますN
。) しかし、平面のどこでポイントが巻き上げられるかを気にしない場合は、共通軸は、ポイントを必要な平面に配置する最も簡単な方法です。
を持っていないが、その平面の原点に対するM
開始平面の点の座標を持っている場合は、 2 つの点の位置から開始法線ベクトルを次のように計算できます。x1
x2
M = cross(x1, x2)
(ここでも使用できますunitcross
が、違いはありません)。平面上にない原点に対する点の座標がある場合でも、それを行うことができますが、3 つの点の位置が必要になります。
M = cross(x3-x1, x3-x2)
単一のベクトル(通常の-N)では不十分です。他の2つの次元には、さらに2つのベクトルが必要になります。(3D空間が法線ベクトルを中心に回転/回転する可能性があり、それを釘付けにするためにさらに2つのベクトルが必要であると想像してください)。平面上に法線ともう1つがあれば、3つ目は簡単に見つけることができます(システムに応じて左利きまたは右利き)。
3つすべてが正規化されていること(長さ1)を確認し、それらを行列に入れます。その行列を使用して、3D空間内の任意の点を変換します(行列の乗算を使用します)。これにより、新しい座標が得られます。
単位ベクトル [0,0,1] を作成し、2 つの平面に沿って内積を使用して差の角度を見つけ、それらの角度ですべてのポイントをシフトすることを考えています。これは、z 軸を法線ベクトルに合わせたいと仮定しています。それ以外の場合は、x と y にそれぞれ [1,0,0] または [0,1,0] を使用します。