Взаимодействие ткани с внешними факторами

Автор работы: Пользователь скрыл имя, 27 Ноября 2013 в 18:38, дипломная работа

Краткое описание

Компьютерная графика нашла широкое распространение и применение в повседневной жизни. Учёные используют компьютерную графику для анализа результатов моделирования. Инженеры и архитекторы используют трёхмерную графику для создания виртуальных моделей. Кинематографисты создают спецэффекты или полностью анимированные фильмы («Шрек», «История игрушек» и др.). В последние годы широкое распространение получили также компьютерные игры, максимально использующие трёхмерную графику для создания виртуальных миров.

Вложенные файлы: 1 файл

диплом.docx

— 116.67 Кб (Скачать файл)

void satisfyConstraint()

{

Vec3 p1_to_p2 = p2->getPos()-p1->getPos(); // vector from p1 to p2

float current_distance = p1_to_p2.length();

Vec3 correctionVector = p1_to_p2*(1 - rest_distance/current_distance);

Vec3 correctionVectorHalf = correctionVector*0.5;

p1->offsetPos(correctionVectorHalf);

p2->offsetPos(-correctionVectorHalf);

}

Тканевые: Создание ткани

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

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

Тканевые: дует ветер, гравитация и столкновения с мячом

Чтобы ткань есть интересное динамическое поведение мы добавим силы ветра и силу тяжести. Мы также будем обрабатывать столкновение с движущимся мячом. Добавление тяжести очень легко, мы просто добавляем вектор ускорения направлен вниз, чтобы все частицы (через ADDFORCE методом на ткани объекта). Обнаружение столкновения и обработку также относительно легко, и я не буду вдаваться в подробности. Мяч определяется центром и радиусом. Обнаружение столкновения делается посредством запроса ли частица находится в пределах радиуса шара, если да столкновений будет решена путем перемещения частиц из шара вдоль вектора от центра к частице так, что расстояние равно радиусу мяча .

Добавление  ветер немного сложнее, но дает очень  хороший эффект. Мы начнем, глядя на ткани в виде набора из трех треугольников каждой частице, и решить проблему добавлением ветра один треугольник за один раз - сложение сил в трех частиц состоит из треугольника. Ветер дует в определенном направлении, но силы должны быть добавлены только в направлении нормали треугольника (или отрицательных нормально), и количество силы, действующей на треугольнике должно быть пропорционально углу (скалярного произведения) между Треугольник и ветер. Это все сводится к простой формуле для одного треугольника:

void addWindForcesForTriangle(Particle *p1,Particle *p2,Particle *p3, const Vec3 direction)

{

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. Для построения нужного примитива достаточно произвести вызов соответствующей команды.

  • void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
  • void glutWireSphere(GLdouble radius, GLint slices, GLint stacks)

Команда glutSolidSphere() строит сферу, а glutWireSphere() -каркас сферы радиусом radius. 

glutSolidSphere и glutWireSphere оказывать твердую или каркасный сфере соответственно.

Использование

радиус

Радиуса сферы.

Ломтики

Количество подразделений  вокруг оси Z (аналогично линии долготы).

стеки

Количество подразделений  вдоль оси Z (по аналогии с линиями  широты).

Описание

Оказывает сферы с центром в начале координат  моделирования указанного радиуса . Сфера подразделяется вокруг оси 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 — «визуализация») — термин в компьютерной графике, обозначающий процесс получения изображения по модели с помощью компьютерной программы.

Изначально  интегрирование Верле было разработано  для симуляции взаимодействий частиц. Если есть множество частиц, которые  взаимодействуют друг с другом по определенным законам, на которые действует  множество сил, то традиционные методы исчисления становятся слишком громоздкими  для программирования систем частиц. Метод Верле был разработан как  более эффективное и устойчивое решение.

Одна  из ключевых особенностей интегрирования Верле – то, что вы явно не используете  скорость объекта для определения  его положения. Вместо этого вы используете  его последнюю позицию. Когда  вам потребуется знание скорости объекта, вы вычитаете значение последней  позиции из текущей позиции. Таким  образом, каждый раз, когда вы перемещаете  объект, вы изменяете его скорость. Это упрощает многие вещи.

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


Информация о работе Взаимодействие ткани с внешними факторами