1

2Dポイント(またはZ = 0の3D)を4Dマトリックスの2Dポイント(Zは無視される)に変換するにはどうすればよいですか?

MicrosoftのSilverlightを使用して、Matrix3DのMatrix3D定義を使用して2Dコントロールを疑似3Dとして投影しています 。

変換されていないコントロールのポイントの初期2D座標がわかっているので、変換後のポイントの2D位置が必要です。

Silverlight APIは、3Dメソッドに関してはまばらです。

計算を実行するための基本的な数学を提案してください。

これは、Silverlight固有の質問の続きです

詳細を編集する

動いていない。使ってます

x = x0 * matrix[0][0] + y0 * matrix[1][0] + z0 * matrix[2][0] +
    w0 * matrix[3][0];

y = x0 * matrix[0][1] + y0 * matrix[1][1] + z0 * matrix[2][1] +
    w0 * matrix[3][1];

z = x0 * matrix[0][2] + y0 * matrix[1][2] + z0 * matrix[2][2] +
    w0 * matrix[3][2];

入力xとyは0,0であり、結果x、yは0、58.5786です。

HasInverse  true    bool
IsIdentity  false   bool
M11 1.0 double
M12 0.0 double
M13 0.0 double
M14 0.0 double
M21 0.0 double
M22 0.70710676908493042 double
M23 0.70710676908493042 double
M24 0.0 double
M31 0.0 double
M32 -0.70710676908493042    double
M33 0.70710676908493042 double
M34 0.0 double
M44 1.0 double
OffsetX 0.0 double
OffsetY 58.578643798828125  double
OffsetZ -141.42135620117187 double

これにより、Zで45度の角度の回転が生成されます。ここで、回転点は平面の下部です。

OffsetXを含むすべてのM1n値は0.0であるため、xは常に元の値になります。

私は何を間違っているのですか?

上記の計算結果を含む4つの値の例を次に示します。

0, 0, 0, 1 -> 0, 58.5786437988281, -141.421356201172, 1
50, 0, 0, 1 -> 50, 58.5786437988281, -141.421356201172, 1
0, 100, 0, 1 -> 0, 129.289320707321, -70.7106792926788, 1
100, 100, 0, 1 -> 100, 129.289320707321, -70.7106792926788, 1

結果の画像を見ると、400x400平面の左上は45,135、右上は355,135、左下は0,400、右下は400,400です。

したがって、テスト値が0,0,0,1.0の場合、xとyは45,135になると予想されます。

4

2 に答える 2

3

2D ベクトルを 4D ベクトルに拡張します - (X, Y, 0, 1); これは同次座標で指定された 3D ベクトルです。4D ベクトルに 4D 行列を掛けて新しい 4D ベクトルを取得し、そこから最初の 2 つのコンポーネントを取得します。

行列がある種の透視投影を指定している場合、最後のコンポーネントで割る必要があります。つまり、結果のベクトルが (x、y、z、w) の場合、最終的な座標は (x/w、y/ w、z/w)。行列に透視投影がない場合、w = 1 となり、最終的なベクトルは (x, y, z) になります。

于 2011-02-23T13:55:01.380 に答える
0

これにショートカットがあるかどうかはわかりませんが、必要なのは次のとおりです。

newX = oldx * mat.M11 + oldY * mat.M21 + mat.OffsetX;
newX = oldx * mat.M12 + oldY * mat.M22 + mat.OffsetY;

(oldZ がゼロであり、newZ の値を無視すると仮定します)。

編集:それを行うより良い方法は次のとおりです。

Vector3D oldPos(oldx, oldy, 0.0f);
Vector3D newPos = oldPos * matrix;

あなたの新しい座標は:newPos.XnewPos.Y;

于 2011-02-21T14:53:10.470 に答える