【问题标题】:Mapping coordinates from plane given by normal vector to XY plane将法线向量给定的平面坐标映射到 XY 平面
【发布时间】:2012-01-08 19:45:07
【问题描述】:

所以,我有这个算法来计算 3D 形状的横截面,平面由法线向量给出。

但是,我目前的问题是,横截面是一组 3D 点(都位于该给定平面上)并且要显示它,我需要将此坐标映射到 XY 平面。

如果平面法线类似于 (0,0,c),这将非常有效 - 我只是复制 x 和 y 坐标而丢弃 z。

这是我的问题:由于我不知道如何转换任何其他纯文本,任何人都可以给我任何关于我现在应该做什么的提示吗?

【问题讨论】:

  • 我怀疑您想要做的是从窗格(您的横截面)投影到另一个(x,y)或从一个到另一个的坐标转换 - 哪个?
  • 目前我在 3D 坐标系中有一组 3D 点 (x, y, z)(实际上是 (x,y,z,1))。我想要的是一组 2D 点 (x', y') (好吧,实际上也是 (x',y', 1)),例如 XY 平面中的 (x',y') 匹配 (x, y, z ) 在由法线向量给出的 3D 平面中。到目前为止,我认为如果我可以旋转向量给出的平面,我可以这样投影点:(x,y,z,1) -> (x,y,1)
  • @EugenRieck 嘿,Eugen,您会说“从窗格(您的横截面)到另一个(x,y)的投影或从一个到另一个的坐标转换”之间的区别/跨度>

标签: algorithm 3d geometry 2d plane


【解决方案1】:

您的窗格由法线向量定义

n=(xn,yn,zn)

对于协调变换,我们需要 2 个基向量和一个用于窗格的零点

基向量

我们选择了那些“自然”适合 x/y 窗格的(见后面的边缘情况):

b1=(1,0,zb1)
b2=(0,1,zb2)

我们想要

b1 x b2 = n*c (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))

一个边缘情况是,当 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

带有 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' 是你想要的新坐标。

【讨论】:

  • 很好的解释!我遇到了同样的问题,为了在计算的基向量上表达 3D 点,我使用点积将它们投影到基向量上。 x' = pt3d.dot(bv1) y' = pt3d.dot(bv2) 对吗?
  • 嗨,我认为这里有一个小错误:b1=(1,0,yn/zn) b2=(0,1,xn/zn) 实际上 b1 * n ~=0,你错过了减号。 b1=(1,0,-yn/zn) b2=(0,1,-xn/zn)
猜你喜欢
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多