Идея называется экструзия с управлением по траектории , т.е. вы имеете базовую n-мерную форму и вытягиваете ее по n + 1-мерной кривой.Я могу прочитать ваше лицо: «А, что он говорит?»
Итак, вот грубый набросок.Сначала вам нужна функция, которая отображает значение, обычно называемое t, в непрерывную гладкую кривую в пространстве.Например, винт:
path(t): R → R³, t ↦ ( a·sin(k·t), b·cos(k·t), c·t )
Идея состоит в том, чтобы найти локализованную базу координат для определения положения ваших вершин по отношению к этому пути - имеет смысл, чтобы одна из координат была выровнена параллельнопуть, так что вы хотите найти его касательным.Это делается путем нахождения градиента:
tangent(t): R → R³, t ↦ ( k·a·cos(k·t), -k·b·sin(k·t), c ) = d/dt path(t)
Итак, это локальный базовый вектор, который направлен вдоль кривой, с началом локальной системы координат в точке t
кривой.
Но нам нужны два других вектора, чтобы сформировать полную трехмерную базу.Обычно хорошим выбором будет иметь вторую базовую точку, перпендикулярную кривизне, которую вы получите, найдя скручивание касательной:
normal(t): R → R³, t ↦ ( -k²·a·sin(k·t), -k²·b·cos(k·t), 0 ) = d/dt tangent(t) = d²/dt² path(t)
Это называется нормалью.
вектор три основания можно получить, взяв перекрестное произведение нормали и тангенса, получая бинормаль.Я позволю вам разобраться с этим в качестве упражнения.
Теперь, чтобы вытянуть фигуру вдоль кривой, вам нужно разделить траекторию на сегменты, просто итерируя t
в выбранном диапазоне, даваяВы местного происхождения.Точки вашей вытянутой формы относятся к этому исходному пути (t).Допустим, ваша фигура состоит из точек P_n в плоскости xy:
for t in [k..l]:
for p in P_n:
yield_vertex( path(t).x + binormal(t).x * p.x,
path(t).y + normal(t).y * p.y,
path(t).z )
Я оставлю это вам, выясняя, как адаптировать это к OpenGL, после всего, что вы должны чему-то научиться, подумав оЭто.Если вы не можете решить это до завтра, я с радостью предоставлю вам решение, но обычно гораздо интереснее самому разобраться.