我在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);
答案 0 :(得分:0)
如果你的三个点是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;
答案 1 :(得分:0)
看这里:ECEF <-> ENU coordinates这可能会有所帮助
我宁愿使用NEH本地北,东,高(或海拔)坐标系
North
向量只是(0,0,6356754.7)-viewer_position
(全部在ECEF中)East,West
向量可以North x (0,0,6356754.7)
Up
向量(高度或高度)很容易从Up=North x East
或Up=North x West
[注释]
South = (0,0,-6356754.7)-viewer_position