3Dの点の座標がある場合Q
: (x, y, z)
P
そして、それを点を含み、法線ベクトル n を持つ平面に投影するとします。
平面の方程式は
(R - P) . n = 0
ベクトル減算を使用する場所.
は内積です。
これから、その平面への任意の点の投影を推測できますn
。平面と交差するまで、法線ベクトルに沿って線を引きます。
したがって、次のa
ような値があります。
Q + a * n
平面にある、すなわち
(Q - a * n - P) . n = 0
a を解く ( に注意n . n = 1
):
a = (Q - P) . n
(注意 - これは Q から P までの「通常の距離」です。偶然ではありません!)
それらが交差する点の値は今です
Q + ((Q - P) . n ) * n
もう一度注意してください - ベクトル演算を使用しているため、最後の*n
結果は 3 つの値になります (n は 3D ベクトルであるため)。
平面に非法線投影を行おうとしている場合 (たとえば、XY 平面に投影したいが、「角度を見ている」場合)、これを一般化できます。この場合、別の方向 m (見ている方向) に沿って投影する必要があり、交点の方程式は次のようになります。
Q + ((Q - P) . n ) * m / (m . n)
ご覧のとおり、m が n に対して垂直である場合 (平面ではなく、平面に沿って見ている場合)、解はありません...
また、XY 平面にまっすぐに射影している場合 (n = [0 0 1])、Z=0 を設定するだけで全体が単純化されることもわかります。
これで十分かどうか、または実際のコード行が必要かどうか教えてください...
--- 編集 --- 簡単なコードを追加:
曲線を表す一連の点 (x, y) がある場合、次のようにして、Z 軸 (平面に垂直) を中心に角度 θ だけ回転できます。
x1 = x * cos(theta) - y * sin(theta);
y1 = x * sin(theta) + y * cos(theta);
これらのポイントを「押しつぶす」ことができるので、y 座標を単純に縮小するだけで、横から見ているように見えます。
x2 = x1;
y2 = y1 * cos(alpha);
ここalpha
で、曲線を見ている見かけの角度です。したがって、XY 平面を真下から見ている場合、alpha
は 0 であり、y2 = y1
です。45度で見るalpha
とpi/4
、y2 = 0.707 * y1
(おおよそ)です。
これら 2 つの変換を次のように組み合わせることができます。
xnew = x * cos(theta) - y * sin(theta);
ynew = cos(alpha) * (x * sin(theta) + y * cos(theta));
いくつかの値のシータ (0 から 0.5 の間、0.1 刻み) とアルファ (同様の範囲がおそらく適切です) に対してこれを試してください。結果が気に入ったかどうかを確認してください。
多分それはあなたにとってより良い(「より便利な」という意味で)答えですか?