これが私の2セントです。それが役に立てば幸い。
私が正しく理解している場合は、3D座標系を回転させてから、指定された2D平面に直交投影します( 2D平面は、元の回転していない3D座標系に対して定義されます)。
「 3D座標系の回転と射影」とは、「3 つの3D基底ベクトルを回転させて2D平面に直交投影し、平面の2D基底に対して2Dベクトルになるようにする」ことです。元の3Dベクトルをプライミングせず、結果の2Dベクトルをプライミングします。{ e1, e2, e3} = {e1..3}を3D正規直交基底 (与えられている) とし、{e1', e2'} = {e1..2'}を2D正規直交基底 (これを指定する必要があります) とします。定義)。基本的に、PR * v = v'となるような演算子PRを見つける必要があります。
線形代数、演算子、および行列表現について多くのことを話すことができますが、投稿するには長すぎます。次のように言えば十分です。
- 3D回転演算子と3D- >2D射影演算子の両方に、実数行列表現があります (線形変換; 2Dは3Dの部分空間です)。
- これらは結果として適用される 2 つの変換、つまりPR * v = P * R * v = v'であるため、回転行列Rと射影行列Pを見つける必要があります。明らかに、Rを使用してvを回転させた後、 Pを使用して結果ベクトルvRを射影できます。
- 回転行列Rは既にあるので、与えられた3x3行列であると見なします。簡単にするために、射影ベクトルvR = R * vについて説明します。
- 射影行列Pは、i番目の列がi番目の3D基底ベクトルeiの {e1..2'}基底への射影である2x3行列です。
3DベクトルvRが正規直交基底{e1..2'}で2D平面上の2Dベクトルv'に線形変換されるようなP射影行列を求めましょう。
2D平面は、それに垂直なベクトルによって簡単に定義できます。たとえば、OP の図から、2D平面 (紙の平面) には通常の単位ベクトルn = 1/sqrt(3) * ( 1, 1, 1 ) があるようです。このnで定義される2D平面で2D基底を見つける必要があります。2Dにある任意の 2 つの線形独立ベクトル平面はそのような基底を形成しますが、ここにはそのような基底が無数にあります。問題の幾何学から、簡単にするために、さらに 2 つの条件を課しましょう。まず、基底が正規直交であること。第二に、視覚的に魅力的である必要があります (ただし、これは多少主観的な条件です)。簡単にわかるように、そのような基底は、e1' = ( 1, 0 )' = x'軸 (水平、左から右への正の方向) およびe2' = ( 0, 1 )' = y'軸 (垂直、下から上への正の方向)。
この{e1', e2'} 2D基底を{e1..3} 3D基底で見つけてみましょう。
- e1 'とe2'を元の基底でe1"とe2"とします。この場合、e1"にはe3成分 ( z成分) がないことに注意し、 n dot e1" = 0という事実を使用すると、e1' = ( 1, 0 )' -> e1" = ( -1 /sqrt(2), 1/sqrt(2), 0 ) ( { e1..3}基底) ここで、ドットは内積を表します。
- 次に、e2" = nクロスe1" = ( -1/sqrt(6), -1/sqrt(6), 2/sqrt(6) ) . ここで、crossはクロス積を表します。
n = 1/sqrt(3) * ( 1, 1, 1 )で定義される2D平面の2x3射影行列Pは、次の式で与えられます。
( -1/sqrt(2) 1/sqrt(2) 0 )
( -1/sqrt(6) -1/sqrt(6) 2/sqrt(6) )
ここで、1 列目、2 列目、3 列目は{e1..3} 3D基底を2D基底{e1..2'}に変換します。つまり、 3D基底からのe1 = ( 1, 0, 0 )は座標( -1/sqrt( 2)、-1/ sqrt (6) )などです。
結果を検証するために、いくつかの明らかなケースを確認できます。
- nは2D平面に直交するため、投影はありません。実際、P * n = P * ( 1, 1, 1 ) = 0です。
- e1、e2、およびe3は、 {e1..2'} の表現、つまりP行列の対応する列に変換する必要があります。実際、P * e1 = P * ( 1, 0 ,0 ) = ( -1/sqrt(2), -1/sqrt(6) )などです。
問題を確定します。ここで、任意に選択された2D平面に対して3Dから2Dへの射影行列Pを作成しました。これで、以前に回転行列Rによって回転された任意のベクトルをこの平面に射影できるようになりました。たとえば、回転した元の基底{R * e1, R * e2, R * e3} . さらに、与えられたPとRを乗算して、回転射影変換行列PR = P * Rを得ることができます。
PS C++ の実装は、宿題として残されています ;)。