Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

torrvic, возможно, Вам нужно добавить -lGLU
Извините за тупой вопрос. У меня при сборке Вашего примера выходит ошибка: "undefined reference to gluLookAt". Не могу найти в какой библиотеке находится эта функция. У меня задано: -lGL -lglut ... Искал в /usr/lib таким образом: nm lib*so* | grep...
Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...

Счетчики и рейтинг

Рейтинг@Mail.ru

Система частиц – широко используемый в компьютерной графике метод представления объектов, не имеющих четки геометрических границ. Облака, туманности, дым, снег – все эти объекты моделируются с помощью систем частиц.
Мы попробуем организовать примитивную систему, моделирующую взаимодействие множества частиц с некоторой точечной силой. При этом под «точечной силой» может подразумеваться гравитационное, электромагнитное или другое взаимодействие похожего рода. При этом наша сила будет появляться и исчезать по нашему желанию.

Итак, необходимо чтобы некоторая сила, воздействовала на каждую точку.
В данном случае я задаю силу весьма тривиально: чем ближе частица в источнику, тем сильнее воздействие. То есть F = G \ D^2. Где G – некоторая константа, с помощью которой мы сможем регулировать взаимодействие, D – расстояние между источником силы и частицей. Сразу оговорюсь что в этой формуле не хватает маленькой детали – не понятно в каком направлении должна действовать сила, то есть надо дополнить формулу так, чтобы F стала векторной величиной, дополним формулу еще одним, на этот раз векторным множителем N = {x, y}, равному разности между координатами источника силы, и координатами нашей точки. Конечный вид формулы F = (G * N) / D^2 .
К слову, если модифицировать формулу знаком минус: F = - (G * N) / D^2, источник силы начнет отталкивать частицы от себя.
Однако, воздействие всего одной силы на точку будет давать слишком «идеальное» движение. Создадим некую силу сопротивления или тормозящую силу, кому как больше нравится. Формула силы сопротивления, в нашем случае, выглядит еще проще Fc = -V * K, где V – вектор скорости, а K – опять-таки, некоторый коэффициент.
Теперь на нашу частицу воздействует по меньшей мере две силы. Следующий шаг – нахождение ускорения.
Вспоминает школьный курс физики (привет, Ньютон) F = m*a a = F/m. Где F – равнодействующая сила, то есть сумма всех сил, действующих на объект.
Напомню вам пару незатейливых фактов:
1. Ускорение характеризует быстроту изменения скорости.
2. Производная от перемещения по времени – скорость.

Также замечу, что мы получили ускорении только на отдельно взятом кадре.
Найдем скорость на данном кадре следующим образом: V(t) = a*dt + V(t - 1) . Здесь dt - это время, которое было потрачено на обработку и прорисовку предыдущего кадра, V(t – 1) – скорость, на прошлом кадре. Для нахождения новых координат частицы осталось воспользоваться вторым фактом, вернее следствием из него. А следствие из него следующее – интеграл от скорости – перемещение. Так что просто находим первообразную нашей скорость по dt. Получаем: x(dt) = ½ * a * dt^2 + V(t – 1) * dt . Таким образом мы нашли перемещение на данном кадре, теперь прибавляем к текущим координатам перемещение, и получаем координаты частицы на данном кадре. X(t) = ½ * a * dt^2 + V(t – 1) * dt + X(t-1).
Напоследок замечу, что новую скорость нашей частицы можно определить как V = (X(t) – X(t – 1)) / dt где X – координаты точки на новом и предыдущем кадре соответственно. В коде, такой вариант работает немного быстрее.