0

図 1: 2D (CoreGraphics) のレイヤーにベジエを描画しています。ポイント A と B があります。

図 2: レイヤーを約 70 度回転できます。

図 3: どういうわけか画像を 3D から 2D に戻すことによって、ポイント A と B が現在何になっているのかを知りたい。

私が理想的に作りたいのは、次のような関数です。

-(CGPoint)calculateNewPointFrom:(CGPoint)p withAngle:(float)angle
{
    //Rotate point by angle in 3d space
    //Return new point in 2d space
}

2D から 3D へ、2D へ戻る

すべてのヘルプ歓迎。ありがとう

4

1 に答える 1

0

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度で見るalphapi/4y2 = 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 刻み) とアルファ (同様の範囲がおそらく適切です) に対してこれを試してください。結果が気に入ったかどうかを確認してください。

多分それはあなたにとってより良い(「より便利な」という意味で)答えですか?

于 2013-02-20T12:45:20.973 に答える