Как рассчитать нормаль точек на трехмерной кубической кривой Безье с учетом нормалей для начальной и конечной точек? - PullRequest
4 голосов
/ 27 декабря 2010

Я пытаюсь визуализировать «3D-ленту», используя одну трехмерную кубическую кривую Безье, чтобы описать ее (ширина ленты является некоторой константой). С первой и последней контрольными точками связан вектор нормали (которые всегда перпендикулярны касательным в этих точках и описывают нормаль поверхности ленты в этих точках), и я пытаюсь плавно интерполировать вектор нормали по Ход кривой.

Например, с учетом кривой, которая образует букву «С», причем первая и последняя контрольные точки имеют нормали поверхности, направленные вверх, лента должна начинаться плоско, параллельно земле, медленно поворачиваться, а затем снова заканчиваться плоско лицом так же, как первая контрольная точка. Чтобы сделать это «плавно», он должен быть обращен наружу на полпути кривой. На данный момент (для этого случая) мне удалось получить только все поверхности, обращенные вверх (а не наружу посередине), что создает уродливый переход в середине.

Это довольно сложно объяснить, я приложил некоторые изображения ниже этого примера с тем, как он выглядит в настоящее время (все поверхности обращены вверх, резкий переворот в середине) и как он должен выглядеть (плавный переход, поверхности медленно вращаются круглый). Серебряные грани обозначают переднюю часть, черные - заднюю.

Неверно, как это выглядит в настоящее время:

Правильная лента http://img211.imageshack.us/img211/4659/ribbonincorrect.th.png

Правильно, как это должно выглядеть:

Неверная лента http://img515.imageshack.us/img515/2673/ribboncorrect.th.png

Все, что мне действительно нужно, это уметь вычислять этот «гибридный нормальный вектор» для любой точки на трехмерной кубической кривой Безье, и я могу без проблем генерировать многоугольники, но я не могу понять, как их получить плавно вращайте вокруг, как изображено. Полностью застрял в том, как действовать!

1 Ответ

2 голосов
/ 27 декабря 2010

Вы можете использовать алгоритм, описанный в первой части этого ответа , оценка нормалей при t = 0 (или фиксированное t, в зависимости от того, что вы выберете) даст вам плавный переход.

Вот так:

alt text

(Представьте себе ваш тротуар вдоль сине-красной границы)

Редактировать

Хорошо, это то, что я получил другим способом:

alt text

Процедура проста:

Есть ваша параметризованная функция:

f[t] := { x[t], y[t], z[t] }  

Рассчитайте касательный вектор, взяв производные:

f'[t] := { x'[t], y'[t], z'[t] }  

Выберите начальный (и конечный нормальный вектор), например:

n[0] = {0, 0, 1};

Теперь определите другую функцию как векторное произведениепроизводная и ваша нормальная:

cp[t_] := CrossProduct[f'[t], n[0]];  

И это все.

Точки моих четырехугольников лежат в:

 {f[t] - cp[t]/3, 
  f[t] + cp[t]/3, 
  f[t + dt] + cp[t + dt]/3, 
  f[t + dt] - cp[t + dt]/3}  

, где dt - прирост, который вам нравится.

Более сложный подход может объяснить длину пути кривой, но я предполагаю, что это вторая итерация алгоритма.

HTH!

...