Я пишу программу, которая будет рисовать твердое тело вдоль кривой сплайна. Я использую Visual Studio 2005 и пишу на C ++ для OpenGL. Я использую FLTK, чтобы открыть мои окна (быстрый и легкий инструментарий).
В настоящее время у меня есть алгоритм, который будет рисовать кардинальный кубический сплайн с заданным набором контрольных точек, разбивая интервалы между точками на подинтервалы и рисуя отрезки линий между этими подточками. Количество подинтервалов является переменным.
Код рисования линий прекрасно работает и в основном работает следующим образом: я генерирую набор точек вдоль кривой сплайна, используя уравнение сплайна, и сохраняю их в массиве (в виде специальной структуры данных под названием Pnt3f, где координаты - 3 числа с плавающей запятой и есть некоторые удобные функции, такие как расстояние, длина, точка и перекрестный продукт). Тогда у меня есть один цикл, который перебирает массив точек и рисует их так:
glBegin(GL_LINE_STRIP);
for(pt = 0; pt<=numsubsegements ; ++pt) {
glVertex3fv(pt.v());
}
glEnd();
Как уже говорилось, этот код прекрасно работает. Теперь я хочу вместо рисования линии выдавливать твердое тело. Мое текущее исследование - использование квадрики «цилиндр» для создания трубы вдоль линии. Это немного сложнее, так как я должен ориентировать openGL в направлении, в котором я хочу нарисовать цилиндр. Моя идея сделать это:
Psuedocode:
Push the current matrix,
translate to the first control point
rotate to face the next point
draw a cylinder (length = distance between the points)
Pop the matrix
repeat
Моя проблема - получить углы между точками. Мне нужны только рыскание и тангаж, крен не важен. Я знаю, что возьмите арккосинус точечного произведения двух точек, разделенных на величину обеих точек, вернем угол между ними, но это не то, что я могу передать в OpenGL для поворота. Я пытался сделать это в 2d, используя плоскость XZ, чтобы получить вращение x, и делая векторы точек из начала координат, но он не возвращает правильный угол.
Мой нынешний подход намного проще. Для каждой плоскости вращения (X и Y) найдите угол по:
арккосинус ((разница значений 'x') / расстояние между точками)
значение 'x' зависит от того, как вы настроили плоскость, хотя для моих расчетов я всегда использую мир x.
Если исключить некоторые проблемы, из-за которых он будет отображать правильный квадрант, который я еще не разработал, я хочу получить совет, чтобы выяснить, является ли это хорошей реализацией, или узнать, знает ли кто-то лучший способ.