У меня есть набор точек в 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 <-> Координаты ЕНУ это может помочь
Я предпочитаю использовать 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
Если вы три точки 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;