Если я правильно понимаю ваш вопрос, вам нужно получить 3 вектора ориентации (слева, спереди, вверх) для любой точки кривой.
Вот простой метод (есть ограничение,(*) см. ниже):
1) Фронтальный вектор:
Рассчитать трехмерную точку на кривой Безье для данной позиции (t).Это точка, для которой мы будем вычислять передний, левый и верхний векторы.Мы назовем это current_point
.
Рассчитаем еще одну 3d точку на кривой, рядом с первой (t + 0,01), назовем ее next_point
.
Примечание:я не пишу здесь формулу, потому что я вам уже верю, как это сделать.
Затем, чтобы вычислить фронтальный вектор, просто вычтите две вычисленные ранее точки:
vector front = next_point - current_point
Не забудьте нормализовать результат.
2) Левый вектор
Определить временный вектор "вверх"
vector up = vector(0.0f, 1.0f, 0.0f);
Теперь выможно легко вычислить влево, используя переднюю и верхнюю части:
vector left = CrossProduct(front, up);
3) Вектор вверх
vector up = CrossProduct(left, front);
Используя этот метод, вы всегда можете рассчитать переднюю, левую,вверх для любой точки вдоль кривой.
(*) ПРИМЕЧАНИЕ: это не будет работать во всех случаях.Представьте, что у вас есть петля на кривой, как петля на американских горках.В верхней части цикла ваш вычисленный вектор будет равен (0, 1, 0), в то время как вы, возможно, захотите, чтобы он был (0, -1, 0).Единственный способ решить эту проблему - это иметь две кривые: одну для точек и одну для векторов вверх (из которых можно легко рассчитать левый и передний).