Рисование непрерывной кривой линии в OpenGL с произвольной шириной - PullRequest
1 голос
/ 20 октября 2011

Я хочу нарисовать непрерывную и кривую линию в OpenGL с произвольной шириной.Я занимаюсь разработкой для сенсорного экрана и уже достиг желаемого эффекта, рисуя линии между старыми координатами X & Y и новыми координатами X & Y.Когда пользователь проводит пальцем по экрану, появляется линия, следующая за его пальцем.Чтобы линия была гладкой, я использовал следующее:

pGL.glEnable(GL10.GL_LINE_SMOOTH); 
pGL.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);

Однако это, по сути, означает, что я не могу контролировать ширину линии, так как она всегда по умолчанию равна 1. Поэтому я пришел к выводу, что япридется придумать какой-то другой способ создать этот эффект.

1 Ответ

2 голосов
/ 20 октября 2011

Вместо линии используйте четырехугольную полосу или треугольную полосу, центрированную по обводке и имеющую желаемую ширину.

РЕДАКТИРОВАТЬ согласно комментарию

Рисование толстой линии с использованием квадратовтреугольники выполняются следующим образом:

Верхняя левая подматрица 3 × 3 вида модели является вращающейся частью.Вы хотите нарисовать линию с утолщениями в пространстве экрана, т.е. обратить вспять локальное вращение.Для этого вам нужно обратное вращение вида модели.Вращения - это ортогональные преобразования, поэтому inverse(M) = transpose(M).

Технически нас интересует только проекция оси Z "Z_local".Для этого мы можем просто взять вектор 3-й строки матрицы вида модели, при этом последний элемент "w" установлен на ноль, а весь вектор нормализован, то есть

Z_local_i = MV_i,3

Далее нам нужен вектор касательной к линии.Это так же просто, как направление между отрезками.Или, более математически, если линия описывается функцией C (t), то тангенс равен

T=∂C(t)/∂t 

Теперь мы можем взять перекрестное произведение между касательной и Z_local, что дает нам нормальное значение

N(t) = Z_local × T(t)

Добавление нормального N (t) к C (t) дает нам эквидистантную кривую, параллельную C. Это позволяет нам рисовать четырехугольники:

for t in range(0, T):
    T = deriv(C(t), t)
    N = cross(Z_local, T)
    emit_vertex(C(t) + width*N)
    emit_vertex(C(t) - width*N)
...