将三维坐标变换为二维坐标,并使用C#
三角形有三个顶点:(x1,y1,z1);(x2,y2,z2);(x3,y3,z3)。 基本上,我想将这3个顶点变换到一个XY平面上,使顶点看起来像(0,0);(c,d);(e,f) 一旦得到XY平面上的点,我会使用2D采样算法生成一些采样点。然后,我对这些采样点应用逆变换,称之为:(l,m,0),并将其转换回3D(类似于(q,w,t)) 如果有人能在以下功能方面帮助我,我将非常高兴: Transform(),它将三维顶点作为输入,并将其转换为二维(XY平面)点 InverseTransform(),它将二维点作为输入,并将其转换为三维(XYZ平面)点将三维坐标变换为二维坐标,并使用C#,c#,graphics,3d,geometry,C#,Graphics,3d,Geometry,三角形有三个顶点:(x1,y1,z1);(x2,y2,z2);(x3,y3,z3)。 基本上,我想将这3个顶点变换到一个XY平面上,使顶点看起来像(0,0);(c,d);(e,f) 一旦得到XY平面上的点,我会使用2D采样算法生成一些采样点。然后,我对这些采样点应用逆变换,称之为:(l,m,0),并将其转换回3D(类似于(q,w,t)) 如果有人能在以下功能方面帮助我,我将非常高兴: Transform(),它将三维顶点作为输入,并将其转换为二维(XY平面)点 InverseTransform(
提前谢谢 编辑:完全重写 您可以在
(0,0,0)中找到变换三维点的仿射矩阵;(c,0,0);(e,f,0)
form(注意第二点的y=0)
首先,将所有点移动(-x1,-y1,-z1)
,这样我们就有了坐标原点中的第一个点。其他两个顶点的新坐标为Bx、By、Bz、Cx、Cy、Cz
,其中Bx=x2-x1
,依此类推(向量B和C)
然后进行旋转,必须:
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
但为什么需要这样的转换呢 也许在初始位置对三角形点进行采样就足够了,如()所示:
你试过什么?我的意思是,对我来说,你想忽略z轴,只需要取xy,然后返回它作为一个点。。所以是什么阻止了你写东西抱歉,只是编辑了它!它类似于,其中一个顶点应转换为原点,其他两个3D点将类似:(a,b)和(c,d)您应该阅读所有关于线性代数的内容您需要
1:1
映射,而不是N:1
投影,因为一旦您将3D点投影到平面上,您就无法返回原始3D坐标。但是,映射很可能无法使用二维插值或您希望执行的任何操作,因为从三维到二维和从二维到二维的映射通常是不连续的,并且会破坏在其他维度中应用的任何几何特征。你最好的选择是改变你想要应用到3D的2D内容。在不知道它是什么的情况下,我们无法决定是否可能(即使你声称不可能,但这并不意味着它真的不可能)。如果你只想在变换后得到三维平面点,那么很容易使用基向量和平面原点在二维和三维之间进行转换。它比听起来要简单,而且采样不是我的主要工作…我有一些不同的采样算法,它们只在2D上工作,而在3D上不工作。我们不能找到将3D点变换为(0,0)的仿射矩阵吗;(a,b)和(c,d)?我给了你们3D的例子sampling@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。它(未知角度方程组的求解)通常是正确的,但我们已经知道一些角度。这就是为什么我删除了这种方法(点对)
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)