【问题标题】:How to multiple a 2D point with a 4D Matrix如何将 2D 点与 4D 矩阵相乘
【发布时间】:2011-02-21 13:28:19
【问题描述】:

如何使用 4D 矩阵将 2D 点(或 Z=0 的 3D)转换为 2D 点(Z 被忽略)?

我正在使用 Microsoft 的 Silverlight 使用 Matrix3D 将 2D 控件投影为伪 3D definition of Matrix3D

我知道未转换控件中某个点的初始 2D 坐标,并且我想要转换后该点的 2D 位置。

silverlight API 很少涉及 3D 方法。

请提出基本的数学计算方法。

这是silverlight specific question的后续内容

编辑更多细节

它不工作。 我正在使用

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

【问题讨论】:

    标签: 3d matrix 2d 4d


    【解决方案1】:

    将您的 2D 向量扩展为 4D 向量 - (X, Y, 0, 1);这是homogeneous coordinates 中指定的 3D 矢量。将 4D 向量乘以 4D 矩阵,从而得到一个新的 4D 向量,从中获取前 2 个分量。

    如果矩阵指定某种透视投影,那么您需要除以最后一个分量,即如果您的结果向量是 (x, y, z, w),那么最终坐标是 (x/w , y/w, z/w)。如果矩阵没有透视投影,那么w = 1,最后的向量就是(x, y, z)

    【讨论】:

      【解决方案2】:

      我不确定是否有捷径,但你想要的是:

      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

      【讨论】:

      • @rob: 矩阵值是多少?
      • 我发布了一个很长的详细回复作为答案,因为我看不到在此处添加回复的方法,并且管理员对其进行了详细说明。如果他们可以检查我是否是新用户,而不是仅仅删除它,或者给我留个便条或将其添加到问题中,那就太好了。现在将详细信息添加到原始问题中。
      • @rob,您的矩阵在 Y 方向上平移了 58.57...(请参阅 OffsetY),因此输出是正确的。你是如何生成矩阵的 - 看起来矩阵不是你想要的,而不是矩阵 * 向量操作失败。
      • 我使用了内置的 silverlight 投影,然后采用了它创建的矩阵,但似乎存在所有 X 值为 0 的问题。
      • 你能给我提供一个 4d 矩阵,它在 Y 轴上以 45 度角描述一个平面,其中旋转点是基础,例如一幅远离你的大画。或者有能力生成这样的东西的网站,我宁愿避免数学。
      猜你喜欢
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2018-07-09
      • 2020-07-21
      • 1970-01-01
      相关资源
      最近更新 更多