Автор работы: Пользователь скрыл имя, 27 Ноября 2013 в 18:38, дипломная работа
Компьютерная графика нашла широкое распространение и применение в повседневной жизни. Учёные используют компьютерную графику для анализа результатов моделирования. Инженеры и архитекторы используют трёхмерную графику для создания виртуальных моделей. Кинематографисты создают спецэффекты или полностью анимированные фильмы («Шрек», «История игрушек» и др.). В последние годы широкое распространение получили также компьютерные игры, максимально использующие трёхмерную графику для создания виртуальных миров.
void satisfyConstraint()
{
Vec3 p1_to_p2 = p2->getPos()-p1->getPos(
float current_distance = p1_to_p2.length();
Vec3 correctionVector = p1_to_p2*(1 - rest_distance/current_distance
Vec3 correctionVectorHalf = correctionVector*0.5;
p1->offsetPos(correctionVec
p2->offsetPos(-correctionVe
}
Мы
подключим частицы в
В сопровождающих исходный код наращивание ткани соединений реализуется в ткань конструктора с использованием частиц и ограничений.
Чтобы ткань есть интересное динамическое поведение мы добавим силы ветра и силу тяжести. Мы также будем обрабатывать столкновение с движущимся мячом. Добавление тяжести очень легко, мы просто добавляем вектор ускорения направлен вниз, чтобы все частицы (через ADDFORCE методом на ткани объекта). Обнаружение столкновения и обработку также относительно легко, и я не буду вдаваться в подробности. Мяч определяется центром и радиусом. Обнаружение столкновения делается посредством запроса ли частица находится в пределах радиуса шара, если да столкновений будет решена путем перемещения частиц из шара вдоль вектора от центра к частице так, что расстояние равно радиусу мяча .
Добавление ветер немного сложнее, но дает очень хороший эффект. Мы начнем, глядя на ткани в виде набора из трех треугольников каждой частице, и решить проблему добавлением ветра один треугольник за один раз - сложение сил в трех частиц состоит из треугольника. Ветер дует в определенном направлении, но силы должны быть добавлены только в направлении нормали треугольника (или отрицательных нормально), и количество силы, действующей на треугольнике должно быть пропорционально углу (скалярного произведения) между Треугольник и ветер. Это все сводится к простой формуле для одного треугольника:
void addWindForcesForTriangle(Parti
{
Vec3 normal = calcTriangleNormal(p1,p2,p3);
Vec3 d = normal.normalized();
Vec3 force = normal*(d.dot(direction));
p1->addForce(force);
p2->addForce(force);
p3->addForce(force);
}
Добавление ветра на ткань позволяет моделировать развевающиеся флаги и другие ткани + ветер вида ситуаций. Эта модель не является абсолютно точным. Ветер влияет на ткань, но ткань не влияет на ветер, для этого потребуется огромное количество жидкости, динамический расчет. Тем не менее, она производит разумную глядя развевающиеся эффектов. Для этого вам необходимо будет моделирования ткани с массой.
Первая ткань должна быть разбита на треугольники. Это легко сделать, так как ткань уже описан как массив точек. Воздействие ветра на ткань рассчитана на каждый из этих треугольников индивидуально. В каждой точке ткань, сумма воздействие ветра на окружающую треугольника вычисляется.
Сила, действующая на треугольник в связи с молекулами воздуха отскакивая он всегда будет в направлении вектора нормали этого треугольника. Вектор нормали для каждого треугольника, очевидно, должны быть рассчитаны для каждого кадра, поскольку он будет постоянно меняются. Сила будет пропорциональна площади поверхности треугольника, угол, под которым ветра попадает в треугольник, и скорости ветра. Просто так случилось, что при использовании векторного произведения расчета вектора нормали треугольника, длина этого вектора пропорциональна площади треугольника, который делает вещи немного проще.
Псевдокодом рассчитать влияние ветра на ткань:
VECTOR: force
VECTOR: normal
VECTOR: wind
set force vector to (0,0,0) on all points on cloth
loop through all triangles
force = unitvector(normal) * dotproduct(normal, wind)
add force to all points making up this triangle
end of loop
loop through all points on cloth
add gravity to force
add force to velocity
end of loop
Объектом, на который падает ткань, в данном примере является сфера.
Команды, проводящие построение примитивов из библиотеки GLUT, реализованы через стандартные примитивы OpenGL и GLU. Для построения нужного примитива достаточно произвести вызов соответствующей команды.
Команда glutSolidSphere() строит сферу, а glutWireSphere() -каркас сферы радиусом radius.
glutSolidSphere и glutWireSphe
Использование
радиус
Радиуса сферы.
Ломтики
Количество подразделений вокруг оси Z (аналогично линии долготы).
стеки
Количество подразделений вдоль оси Z (по аналогии с линиями широты).
Описание
Оказывает
сферы с центром в начале координат
моделирования указанного радиу
Подключение клавиатуры.
Запуск и остановка анимации осуществляется при нажатии пробела на клавиатуре. Это совершается с помощью функции:
void keyboard( unsigned char key, int x, int y )
{
switch ( key ) {
// Выход на ESC
case 27:
exit ( 0 );
break;
// Запуск и пауза на пробел
case 32:
started = !started;
lastUpdate = glutGet(GLUT_ELAPSED_TIME);
break;
}
}
glutGet(GLUT_ELAPSED_TIME) - Число миллисекунд
// использование распараллеливания
// нормали(хотя бы прочитать про них)
// в приложении картинку изначального положения ткани и исходный результат
Для себя:
Ре́ндеринг (англ. rendering — «визуализация») — термин в компьютерной графике, обозначающий процесс получения изображения по модели с помощью компьютерной программы.
Изначально интегрирование Верле было разработано для симуляции взаимодействий частиц. Если есть множество частиц, которые взаимодействуют друг с другом по определенным законам, на которые действует множество сил, то традиционные методы исчисления становятся слишком громоздкими для программирования систем частиц. Метод Верле был разработан как более эффективное и устойчивое решение.
Одна из ключевых особенностей интегрирования Верле – то, что вы явно не используете скорость объекта для определения его положения. Вместо этого вы используете его последнюю позицию. Когда вам потребуется знание скорости объекта, вы вычитаете значение последней позиции из текущей позиции. Таким образом, каждый раз, когда вы перемещаете объект, вы изменяете его скорость. Это упрощает многие вещи.
Другая
общая черта интегрирования Верле
– понятие связи между
Информация о работе Взаимодействие ткани с внешними факторами