Сдвиг набора точек в 3d

У меня есть набор точек в 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);

-3

Решение

Смотри сюда: ECEF <-> Координаты ЕНУ это может помочь

Я предпочитаю использовать NEH локальную систему координат Север, Восток, Высота (или высоту)

  • это похоже на компас + высотомер
  • если вы не смотрите в направлении оси вращения (ECEF Z-axis) … на полюсах
  • затем 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
  • еще раз, если неправильное направление обратный порядок или отрицание результата …
[Заметки]
  • 6356754,7 [м] — полярный радиус Земли
  • если вы просматриваете с полюсов (ECEF Z-axis)
  • тогда вектор севера и вектор вверх лежат на одной оси (в противоположном направлении)
  • что означает, что нет ни востока, ни запада (сингулярность)
  • в южном полушарии обычно используется юг, а не север
  • в таком случае South = (0,0,-6356754.7)-viewer_position
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;
0

По вопросам рекламы [email protected]