Geometry 如何在PCL中绘制平面法线

Geometry 如何在PCL中绘制平面法线,geometry,point-cloud-library,Geometry,Point Cloud Library,我有一个平面方程,描述了3D中属于一个平面的点,以及法线X,Y,Z的原点。这应该足以生成3D箭头之类的东西。在pcl中,这可以通过查看器实现,但我希望实际将这些3D点存储在云中。那么如何生成它们呢?顶部有圆锥体的圆柱体 要生成垂直于平面的线: 你有平面方程。这将为您提供平面法线的方向。如果使用PCL获取平面,则这是模型系数。详情如下: 第一步是在你提到的点(X,Y,Z)上画一条垂直于法线的线。让(NORMAL\ux,NORMAL\uy,NORMAL\uz)成为从平面方程得到的法线。差不多 pcl

我有一个平面方程,描述了3D中属于一个平面的点,以及法线X,Y,Z的原点。这应该足以生成3D箭头之类的东西。在pcl中,这可以通过查看器实现,但我希望实际将这些3D点存储在云中。那么如何生成它们呢?顶部有圆锥体的圆柱体

要生成垂直于平面的线:

你有平面方程。这将为您提供平面法线的方向。如果使用PCL获取平面,则这是模型系数。详情如下:

第一步是在你提到的点(
X
Y
Z
)上画一条垂直于法线的线。让(
NORMAL\ux
NORMAL\uy
NORMAL\uz
)成为从平面方程得到的法线。差不多

pcl::PointXYZ pnt_on_line;
for(double distfromstart=0.0;distfromstart<LINE_LENGTH;distfromstart+=DISTANCE_INCREMENT){
  pnt_on_line.x = X + distfromstart*NORMAL_X;
  pnt_on_line.y = Y + distfromstart*NORMAL_Y;
  pnt_on_line.z = Z + distfromstart*NORMAL_Z;
  my_cloud.points.push_back(pnt_on_line);
}
现在为了计算新点的坐标,我们已经有了直线上的点,现在我们只需要将它添加到一个向量中,以适当的角度方向将它从直线上移开。假设圆柱体的半径为0.1,假设我们已经计算出的垂直于平面法线的正交基(我们将在后面看到如何计算)是
vertical\u 1
vertical\u 2
(即,两个相互垂直的向量,长度为1,也垂直于向量(法线X,法线Y,法线Z)):

实际上,这是一个向量求和,如果我们把运算写成向量,它会是这样的:

for(double distfromstart=0.0;distfromstart<LINE_LENGTH;distfromstart+=DISTANCE_INCREMENT){
   for(double angle=0.0;angle<2*M_PI;angle+=M_PI/8){
      //calculate coordinates of point and add to cloud
   }
}
pnt_on_line+perpendicular_1*cos(angle)+perpendicular_2*sin(angle) 
现在我说我将讨论如何计算
vertical\u1
vertical\u2
。让K是任何不平行的单位向量(
NORMAL\ux
NORMAL\uy
NORMAL\uz
)(可以通过尝试
(1,0,0)
然后
(0,1,0)

然后

这里
X
是向量叉积,上面是向量方程。还要注意的是,pnt_在_线上的原始计算涉及向量点积和向量求和(我写这篇文章是为了说明的完整性)


如果你能做到这一点,那么只需在双循环中改变一些东西,圆锥体就很容易了:半径只会沿着其长度变化,直到在循环结束时为零,而在循环中,distfromstart不会从0开始。要生成垂直于平面的线,请执行以下操作:

你有一个平面方程。这给了你平面法线的方向。如果你用PCL得到平面,这是在模型系数中。见这里的细节:

第一步是在你提到的点(
X
Y
Z
)上画一条垂直于法线的线。让(
normal\ux
normal\uy
normal\uz
)成为你从平面方程得到的法线。类似这样的东西

pcl::PointXYZ pnt_on_line;
for(double distfromstart=0.0;distfromstart<LINE_LENGTH;distfromstart+=DISTANCE_INCREMENT){
  pnt_on_line.x = X + distfromstart*NORMAL_X;
  pnt_on_line.y = Y + distfromstart*NORMAL_Y;
  pnt_on_line.z = Z + distfromstart*NORMAL_Z;
  my_cloud.points.push_back(pnt_on_line);
}
现在为了计算新点的坐标,我们已经有了直线上的点,现在我们只需要将它添加到一个向量中,以适当的角度方向将它从直线上移开。假设圆柱体的半径为0.1,假设我们已经计算了正交基平面的法线(我们将在后面看到如何计算)是
垂直_1
垂直_2
(即,两个向量相互垂直,长度为1,也垂直于向量(法线_X,法线_Y,法线_Z)):

实际上,这是一个向量求和,如果我们把运算写成向量,它会是这样的:

for(double distfromstart=0.0;distfromstart<LINE_LENGTH;distfromstart+=DISTANCE_INCREMENT){
   for(double angle=0.0;angle<2*M_PI;angle+=M_PI/8){
      //calculate coordinates of point and add to cloud
   }
}
pnt_on_line+perpendicular_1*cos(angle)+perpendicular_2*sin(angle) 
现在我说我将讨论如何计算
vertical\u1
vertical\u2
。让K是任何不平行的单位向量(
NORMAL\ux
NORMAL\uy
NORMAL\uz
)(可以通过尝试
(1,0,0)
然后
(0,1,0)

然后

这里
X
是向量叉积,上面是向量方程。还要注意的是,pnt_在_线上的原始计算涉及向量点积和向量求和(我写这篇文章是为了说明的完整性)


如果你能做到这一点,那么只要在双循环中改变一些东西,圆锥体就很容易了:半径只是沿着它的长度变化,直到在循环结束时变为零,而在循环中,距离FromStart不会从0开始。

是否有可能在圆锥体生成部分扩展一点……非常感谢您的帮助o-如果你让我知道你到目前为止得到了什么,我可能会在正确的方向上提供帮助。如果时间允许,我会在我想可能会有帮助的领域添加更多内容。我可以通过简单地将0.1系数作为变量f(distfromstart)来处理,并且只在平面法线的上端画圆。f(距离开始)当您完成距离迭代时,向0前进。非常感谢您,先生,是否有可能在圆锥体生成部分扩展一点…非常感谢您的帮助您好-如果您让我知道您到目前为止获得了什么,我可能可以在正确的方向上提供帮助。我将很快在我想可能是的区域中添加更多内容有帮助,时间允许。我可以通过简单地将0.1系数视为变量f(distfromstart)并只在平面法线的上端画圆来实现它。当您完成距离迭代时,f(distfromstart)将朝向0。非常感谢您,先生