【问题标题】:Transform point coordinates from 3D space to a generic 2D plane in SlimDX在 SlimDX 中将点坐标从 3D 空间转换为通用 2D 平面
【发布时间】:2015-08-28 19:11:33
【问题描述】:

我需要在通用 2D 平面(使用 SlimDX.Plane 定义,带有 3 个 Vector3)中投影 SlimDX.Vector3(X、Y 和 Z 分量)。请注意,该平面是通用的,而不是屏幕平面(否则,可以使用 Vector3.Project)。 我需要确定从 3D 空间到 2D 平面的变换矩阵(或四元数),但我不知道如何。 平面的原点可以是任何东西,例如用于定义平面的第一个点。

有人可以帮忙吗?

【问题讨论】:

  • 你想如何进行投影?从 3D 空间到 2D 平面有无数种变换。
  • 为了更清楚,我需要局部平面中的节点坐标,即二维坐标。我需要在这个表面上建立一个网格,然后再次获得 3D 坐标(使用逆变换)。
  • 还不清楚。二维坐标系是如何表征的?
  • 这是一个简单的正交坐标系,它的原点位于平面上的一个点上。换句话说,我想知道属于一个平面的点的 2d 坐标 (x,y),知道平面和点的 3D 坐标。
  • 这是你想要的吗? stackoverflow.com/a/23474396/380384

标签: .net 3d transformation slimdx plane


【解决方案1】:

我认为你想要的是用

给出的点到平面(沿法线)的分离
float h = Plane.DotNormal(plane, point);

然后从该点沿平面法线减去这个量

Vector3 proj = point - h*plane.Normal;

结果点应该位于平面上。

【讨论】:

  • 我已经知道点就在那个平面上。无论如何,执行您建议的操作,我得到的坐标与以前相同(我尝试使用由 3D 空间中的 3 个节点定义的平面)。
  • 那么您还没有很好地解释您要做什么。我以为你想将一个 3D 点投影到平面上(这是我的回复)。
【解决方案2】:

你的问题还是很不清楚。但是,我正在尝试在黑暗中拍摄。

让我们从计算平面的模型变换开始(它将位于 x/y 平面上的平面变换为其实际位置)。您正在寻找的变换是这个矩阵的逆矩阵。

我们可以通过找到主体的图像来构建矩阵。起源很简单。正如您所指定的,原点应映射到第一个点 (v1)。 z轴也很简单。这是飞机的常态。因此,矩阵为:

    /  .           .           .          . \
M = |  .           .           .          . |
    | p.Normal.X  p.Normal.Y  p.Normal.Z  0 |
    \ v1.X        v1.Y        v1.Z        1 /

现在是您的描述缺少信息的部分。我们需要平面上的局部 x 轴。我假设这个轴是由第二个向量定义的:

Vector3 x = Vector3.Normalize(v2 - v1);

那么,得到的局部y轴是:

Vector3 y = Vector3.Normalize(Vector3.Cross(p.Normal, x));

还有:

    / x.X         x.Y         x.Z         0 \
M = | y.X         y.Y         y.Z         0 |
    | p.Normal.X  p.Normal.Y  p.Normal.Z  0 |
    \ v1.X        v1.Y        v1.Z        1 /

如前所述,您需要这个矩阵的逆矩阵。因此:

       /  x.X     y.X     p.Normal.X  0 \
M^-1 = |  x.Y     y.Y     p.Normal.Y  0 |
       |  x.Z     y.Z     p.Normal.Z  0 |
       \ -v1.X   -v1.Y      -v1.Z     1 /

更简洁,因为您不需要第三维和第四维(尽管这可能不是 SDX 最方便的表示):

       /  x.X     y.X  \
   T = |  x.Y     y.Y  |
       |  x.Z     y.Z  |
       \ -v1.X   -v1.Y /

【讨论】:

  • 请说出 M 和 T 到底是什么...我可以将它们与 Vector3.Transform 一起使用吗?
  • 它们是矩阵。你应该使用M^-1(将它打包成一个矩阵并转换向量)。
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多