在3d中移动点的集合

Shift set of points in 3d

本文关键字:集合 移动 3d      更新时间:2023-10-16

我在3d中有一组点。我把这些点连接起来,形成一条直线。我必须得到另一条线,它是这条线的位移版本,使得最终的位移总是在原始线的右边。解决这个问题的方法是什么?如何每次都使上向量在正确的方向上?

假设这些点位于一个球体上。看看球体的顶视图,我想要这样写

////
////

第一行是点的原始集合,第二行是移位的集合

好的,我正在添加代码

std::vector<osg::Vec3> vertArray; // The array containig the 3d points
std::vector<osg::Vec3> shiftVec; // The array to store the shifted vectors
osg::Vec3 line1, line2, result, upVec, p1, p2, cross1, cross2;
result = vertArray[1] - vertArray[0];
result.normalise();
result = result X upVec; // i am not sure how to get this upvec for general set of   points
shiftVec.push_back(result);
for(unsigned int i = 1; i < vertArray.size() - 1; i++)
{
 line 1 = vertArray[i-1] - vertArray[i];
 line 2 = vertArray[i+1] - vertArray[i];
 line1.normalise();
 line2.normalise();
 upVec = line1 X line2;
 line 1 = line1 X upVec;
 p1 = vertArray[i-1] + line1;
 line 2 = line2 X upVec;
 p2 = vertArray[i+1] + line2;
 cross1 = upVec;
 cross2 = (p2-p1)X line2
 float factor = cross2.lenght()/cross1.length();
 result = p1+line1*factor;
 result = result - vertArray[i];
 shiftVec.push_back(result);
}
result = vertArray[i] - vertArray[i-1];
result.normalise();
result = result X upVec; // i am not sure how to get this upvec for general set of points
shiftVec.push_back(result);

看这里:ECEF <-> ENU坐标,这可能有帮助

我宁愿使用NEH本地北、东、高(或海拔)坐标系

  • 类似罗盘+高度计
  • 如果你没有在旋转轴方向(ECEF z轴)…在波兰人
  • North向量就是(0,0,6356754.7)-viewer_position(全部在ECEF中)
  • East,West向量可以得到North x (0,0,6356754.7)
  • 不记得是东还是西(取决于你的坐标系和交叉乘子顺序)
  • 目视检查,如果错误,颠倒顺序或否定结果
  • Up矢量(高度或海拔)很容易从这只是Up=North x EastUp=North x West
  • 如果方向错误,请再次反转或否定结果…
(笔记)

  • 6356754.7 [m]为地球极半径
  • 如果你从极点(ECEF z轴)看
  • 则North vector和Up vector在同一轴上(相反方向)
  • 这意味着没有东方或西方(奇点)
  • 南半球的
  • 通常使用south而不是North
  • South = (0,0,-6356754.7)-viewer_position

如果三个点分别是A, B和c,那么这三个点定义了一个平面。一般来说,这些点不在一条直线上。如果他们这样做,那么"正确"的含义就变得模棱两可了。如果所有的东西都在一个球体上,那么这三点将定义一个由球体和平面相交形成的曲线。你可以通过求球面与平行平面的交点来形成另一条直线。

我不太确定你想要什么,但我猜你想要第二条线在一个平行平面上。你可以通过求外积N=(A-B) X (C-B)找到这个平面的法向量。看起来你正在做这样的事情,但你需要^操作符。见https://www8.cs.umu.se/kurser/TDBD12/VT04/lab/osg/html/doc + +/用osg Vec3.html # DOC.2.224.21

upVec = line1 ^ line2;