【问题标题】:Transforming 3D Coordinatees to 2D and also inverse transformation using C# [closed]使用 C# 将 3D 坐标转换为 2D 以及逆变换 [关闭]
【发布时间】:2018-01-12 18:35:28
【问题描述】:

我有一个三角形的三个顶点:(x1,y1,z1); (x2,y2,z2); (x3,y3,z3)。 基本上,我想将这 3 个顶点转换到 XY 平面上,使顶点看起来像 (0,0); (光盘); (e,f)。

一旦我得到 XY 平面上的点,我会使用 2D 采样算法生成一些采样点。然后,我将逆变换应用于这些采样点,将其称为 :(l,m,0) 并对其进行变换回到 3D(某物,例如 (q,w,t))。

如果 Some 可以帮助我完成以下功能,我将非常高兴: Transform(),它将 3D Vertices 作为输入,并将其转换为 2D(XY PLane) 点。

InverseTransform(),将 2D 点作为输入,并将其转换为 3D(XYZ PLane) 点。

提前致谢!

【问题讨论】:

  • 你试过什么?我的意思是它在我看来就像你想忽略 z 轴,只取 xy 并将其作为一个点返回.. 所以.. 是什么阻止你写一些东西来做到这一点
  • 抱歉,刚刚编辑了!就像,一个顶点应该转换为原点,其他两个 3D 点将是:(a,b) 和 (c,d)
  • 你应该阅读所有关于线性代数的文章
  • 您需要 1:1 映射而不是 N:1 投影,因为一旦将 3D 点投影到平面上,您就无法返回到原始 3D 坐标。但是,映射很可能无法使用 2D 插值或您想做的任何事情,因为 1:1 从 3D 到 2D 的映射通常不是连续的,并且会破坏其他维度中应用的任何几何特征。您最好的选择是更改您想要应用于 3D 的 2D 内容。在不知道它是什么的情况下,我们无法决定是否可能(即使您声称不可能,但这并不意味着它真的不可能)。
  • 如果您只想要转换后的 3D 平面点,那么只需使用基向量和平面的原点在 2D 和 3D 之间转换即可。它比听起来更简单,请参阅 C++ plane interpolation from a set of pointsCalculate Y of 3D point on 3D QUAD PLANE based on X,Z in that point

标签: c# graphics 3d geometry


【解决方案1】:

编辑:完全重写

您可以找到以(0,0,0); (c,0,0); (e,f,0) 形式转换3D 点的仿射矩阵(注意y=0 第二点)。

首先,将所有点移动(-x1,-y1,-z1),这样我们就有了坐标原点的第一个点。其他两个顶点的新坐标是Bx,By,Bz,Cx,Cy,Cz,其中Bx=x2-x1 等等(向量BC)。

然后遵循必须的旋转:

1) 将B点转换为OX轴上的点,其中Lb是向量B的长度。

 Bx,By,Bz => Lb,0,0 

2) 将三角形的法线转换为与 OZ 轴共线的向量。

 N = B x C  //cross product
 Ln = Length(N)
 Nx,Ny,Nz => 0,0,Ln

3) 我有一段时间不清楚:)
将源正交基的第三个向量转化为与OY轴共线的向量

P = B x N  
Lp = Length(P)
Px,Py,Pz => 0,Lp,0

一起收集:

             [Bx  Nx  Px]    [Lb  0  0]
 RotMatrix * [By  Ny  Py] =  [0   0  Lp]
             [Bz  Nz  Pz]    [0  Ln  0]

或更短的

RotMatrix * BNP = L

所以我们可以找到

 RotMatrix  = L * Inverse(BNP)

最后

AffineMatrix = ShiftMatrix * RotMatrix

但是为什么需要这样的转换呢?

也许像这样在初始位置采样三角形点就足够了(trilinear coordinates):

for u = 0 to N  //sampling level
  for v = 0 to N - u
     w = N - u - v
     p = GetPoint(Vertices, u/N, v/N, w/N)

【讨论】:

  • 采样不是我的主要工作......我有一些不同的采样算法,它们只适用于 2D 而不是 3D。我们不能找到将 3D 点转换为 (0,0) 的仿射矩阵吗? (a,b) 和 (c,d)?
  • 我给你举了 3D 采样的例子
  • @MB0:你是对的!你能写出将 3D 顶点转换为 (0,0) 的算法吗? (c,0) 和 (e,f)??
  • 我认为,它的 [[x2',y2',z2'],[x3',y3'z3']] * Mrot = [[Length12,0,0][someX,someY, 0]]对吗? bcoz, M = M = Mshift * Mrot.
  • 它(求解未知角度的方程组)通常是正确的,但我们已经知道一些角度。这就是为什么我删除了这种方法(点对)
猜你喜欢
  • 2018-05-25
  • 1970-01-01
  • 2015-01-01
  • 2012-03-06
  • 2015-06-29
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多