1

如何使用 4D 矩阵将 2D 点(或 Z=0 的 3D)转换为 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 始终是原始值。

我究竟做错了什么 ?

这是我的四个示例值以及上述数学的结果

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 回答