Нарисуйте нервные линии в OpenGL - PullRequest
0 голосов
/ 26 августа 2011

Предположим, я нарисовал несколько простых линий в OpenGL, например:

glBegin(GL_LINES);
glVertex2f(1, 5);
glVertex2f(0, 1);
glEnd();

Как сделать так, чтобы линия выглядела нервной, как будто она была нарисована или нарисована рукой?

1 Ответ

1 голос
/ 26 августа 2011

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

Вот некрасивый, но, надеюсь, несколько полезный код. Вы можете выполнить рефакторинг по мере необходимости:

const float X1= 1.0f, Y1 = 5.0f, X2 = 0.0f, Y2 = 1.0f;
const int NUM_PTS = 10; //however many points in between

//you will need to call srand() to seed your random numbers

glBegin(GL_LINES);
glVertex2f(START_X, START_Y);
for(unsigned i = 0; i < NUM_PTS; i += 2)
{
  float t = (float)i/NUM_PTS;
  float rx = (rand() % 200 - 100)/100.0f; //random perturbation in x
  float ry = (rand() % 200 - 100)/100.0f; //random perturbation in y
  glVertex2f( t * (END_X - START_X) + r, t * (END_Y - START_Y) + r);
  glVertex2f((t + 1) * (END_X - START_X), (t + 1) * (END_Y - START_Y));
}
glVertex2f(END_X, END_Y);
glEnd();

Я увеличиваю цикл на 2 и рисую каждую другую точку без случайного возмущения, чтобы все отрезки линии были соединены вместе.

Возможно, вы захотите знать, что стиль glBegin / glEnd называется «немедленный режим» и не очень эффективен. Это даже не поддерживается на некоторых мобильных платформах. Если вы обнаружите, что ваш материал вялый, посмотрите на использование массивов вершин.

Чтобы линия выглядела нарисованной от руки и лучше, вы также можете сделать ее более жирной и использовать сглаживание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...