所以,我有这个算法来计算3D平面与法向矢量给出的平面的截面。从法向矢量给出的平面到XY平面的坐标映射
但是,我目前的问题是,横截面是由三维点组成(全部位于给定平面上)并显示它,我需要将此坐标映射到XY平面。
如果平面法线类似于(0,0,c) - 这就完美了 - 我只是复制x和y坐标而丢弃z。
这里是我的问题:由于我不知道如何转换任何其他平原,任何人都可以给我任何暗示,我现在该怎么办?
所以,我有这个算法来计算3D平面与法向矢量给出的平面的截面。从法向矢量给出的平面到XY平面的坐标映射
但是,我目前的问题是,横截面是由三维点组成(全部位于给定平面上)并显示它,我需要将此坐标映射到XY平面。
如果平面法线类似于(0,0,c) - 这就完美了 - 我只是复制x和y坐标而丢弃z。
这里是我的问题:由于我不知道如何转换任何其他平原,任何人都可以给我任何暗示,我现在该怎么办?
你窗格可通过正常的矢量
n=(xn,yn,zn)
对于坐标变换定义,我们需要2个基向量和零点窗格
基向量
我们选择那些“自然地“装配到x/y窗格(稍后参见边缘情况):
b1=(1,0,zb1)
b2=(0,1,zb2)
我们想
(C const的标量)
,以确保这两个是真正立足
现在解决这个问题:
b1 x b2= (0*zb2-zb1*1,zb1*0-1*zb2,1*1-0*0) = (zb1,zb2,1)
zb1*c=xn
zb2*c=yn
1*c=zn
c=zn,
zb2=yn/c=yn/zn
zb1=xn/c=xn/zn
b1=(1,0,yn/zn)
b2=(0,1,xn/zn)
和规范它
bv1=(1,0,yn/zn)*sqrt(1+(yn/zn*yn/zn))
bv2=(0,1,yn/zn)*sqrt(1+(xn/zn*xn/zn))
An边缘情况是,当zn = 0时:在这种情况下,法向矢量平行于x/y窗格,并且不存在自然基矢量。在这种情况下,您必须通过美观POV选择基底b1和b2矢量,并通过相同的解决方案流程或只选择bv1和bv2。
零点
你不会说锚点在OQ的窗格,但它需要从平行窗格的无限族区分你的窗格。
如果你的定位点(0,0,0),这是为坐标变换一个完美的锚点和您的面板上有
x*xn+y*yn+z*zn=0,
(y0,y0,z0)=(0,0,0)
如果没有,我假设你有(XA的锚点,ya,za)并且您的窗格有
x*xn+y*yn+z*zn=d
with d const标量。自然地适合将是窗格的点,即由原始零点的正常投影所限定到窗格:
P0=(x0,y0,z0)
与
(x0, y0, z0) = c * (xn,yn,zn)
解决这个反对
x*xn+y*yn+z*zn=d
给出
c*xn*xn+c*yn*yn+c*zn*zn=d
和
c=d/(xn*xn+yn*yn+zn*zn)
从而
P0=(x0,y0,z0)=c*(xn,yn,zn)
被发现。
最终转化
由代表你的窗格的每一个点(即你想显示这些点)作为
P0+x'*bv1+y'*bv2
具有x“和y”是新的坐标来实现的。既然我们知道P0,bv1和bv2,这是相当微不足道的。如果我们不在边缘情况下,我们在bv1.y和bv2.x中有零点,进一步减少了问题。
x'和y'是您想要的新坐标。
非常好的解释!我面临同样的问题,并在计算出的基向量上表示三维点,我使用点积将它们投影到基向量上。 'x'= pt3d.dot(bv1) y'= pt3d.dot(bv2)' 它是正确的吗? – Dexter 2012-02-15 15:34:58
嗨,我想这里有一个小错误: 'b1 =(1,0,yn/zn) b2 =(0,1,xn/zn)' 实际上b1 * n〜= 0,减去。 (1,0,-n/zn) b2 =(0,1,-xn/zn)' – 2017-09-12 21:50:43
我怀疑你想要做的是投影从窗格(你的横截面)到另一个(x,y)或从一个到另一个坐标转换 - 哪一个? – 2012-01-08 19:51:05
目前,我在3D坐标系中设置了三维点(x,y,z)(实际上(x,y,z,1))。我想要的是在XY平面匹配(x,y,z)的二维点(x',y')(例如x',y',1) )在由法向量给出的3D平面中。到目前为止,我认为如果我可以旋转矢量给出的平面,我可以用这种方式来设计点:(x,y,z,1) - >(x,y,1) – stollgrin 2012-01-08 19:59:15
@EugenRieck Hey Eugen,你会怎么说是“从窗格(你的横截面)到另一个(x,y)的投影或者从一个到另一个的坐标变换” – user1084113 2013-03-04 16:36:50