Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX. Продвинутая Анимация (2004) [rus].pdf
Скачиваний:
335
Добавлен:
16.08.2013
Размер:
8.39 Mб
Скачать

390

Глава 13

Итак, интегрирование вперед является не чем иным как масштабированием векторов. Просто, не так ли? Единственное, о чем я не упомянул, это то, что вам необходимо принять во внимание массы точек. Помните, чем большую массу имеет объект, тем большую силу необходимо приложить, чтобы сдвинуть его. Я имею ввиду момент, т. е. то, что комбинированная сила точки (представленная вектором силы) должна быть масштабирована на массу, чтобы вычислить фактически применяемое ускорение. Масштабирование вектора силы на значение массы (на самом деле на значение 1/масса) при интегрировании замечательно с этим справляется.

ClothPoints[Num].m_vecVelocity += TimeElapsed * \

ClothPoints[Num].m_OneOverMass * \

ClothPoints[Num].m_vecForce;

Подытожив, необходимо умножить вектор силы каждой точки на массу (1/масса) и прошедшее время, после чего добавить результирующий вектор к вектору скорости точки. Вот отрывок кода, который выполняет все это для каждой точки одежды:

// TimeElapsed = количество обрабатываемых секунд for(DWORD i=0;i<NumPoints;i++) {

// Интегрировать скорость ClothPoints[Num].m_vecVelocity += TimeElapsed * \

ClothPoints[Num].m_OneOverMass * \ ClothPoints[Num].m_vecForce;

// Интегрировать положение ClothPoints[Num].m_vecPos += TimedElapsed * \

ClothPoints[Num].m_vecVelocity;

}

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

Воссоздание и визуализация меша одежды

Т. к. точки одежды изменили свое положение, необходимо перестроить начальный меш так, чтобы изменения были заметны. Т. к. вы уже загрузили исходный меш из .X файла в объект ID3DXMesh, все, что остается сделать, это заблокировать буфер вершин меша, сохранить в него координаты точек и пересчитать нормали (если исходный меш их использует).

Еще раз создадим универсальную структуру, содержащую только вектор. Этот вектор используется для получения доступа к данным координат вершин меша.

Имитирование одежды и анимация мешей мягких тел

typedef struct { D3DXVECTOR3 vecPos;

} sVertex;

После этого необходимо просто заблокировать буфер вершин меша и просмотреть все точки одежды (опять!), сохраняя их координаты.

// Заблокировать буфер вершин меша BYTE *pVertices;

pClothMesh->LockVertexBuffer(0, (BYTE**)&pVertices);

for(DWORD i=0;i<NumPoints;i++) {

//Преобразовать указатель на вершину sVertex *pVertex = (sVertex*)pVertices;

//Сохранить координаты вершины *pVertex = ClothPoints[i].m_vecPos;

//Перейти к следующей вершине pVertices += VertexStride;

}

// Разблокировать буфер вершин pClothMesh->UnlockVertexBuffer();

После того как вы воссоздали меш, вы можете визуализировать его обычным образом, просмотрев список материалов меша и используя функцию ID3DXMesh::DrawSubset для визуализации каждого поднабора. Если вы хотите повторно использовать исходный меш, например, для сброса имитации одежды, необходимо восстановить исходные координаты его вершин.

Восстановление исходного меша

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

Самым простым способом восстановления данных точек исходного меша одежды является добавление еще одного вектора в класс cClothPoint.

class cClothPoint {

D3DXVECTOR3 m_vecOriginalPos; // Начальные координаты D3DXVECTOR3 m_vecPos; // Трехмерные координаты точки float m_Mass; // Масса точки (0=прикрепленная)

float m_OneOverMass; // 1 / Массу (0=прикрепленная к месту) D3DXVECTOR3 m_vecForce; // Вектор силы (ускорения) D3DXVECTOR3 m_vecVelocity; // Вектор скорости

};

392

Глава 13

Дополнительный вектор (vecOriginalPos) хранит начальные координаты точек одежды. При создании массива точек одежды убедитесь, что вы сохранили начальное положение в этом новом векторе.

//...После загрузки точек одежды в массив for(DWORD i=0;i<NumPoints;i++)

ClothPoints[i].m_vecOriginalPos = ClothPoints[i].m_vecPos;

Когда вы захотите восстановить данные исходных точек одежды, просто скопируйте данные их этого нового вектора в вектор положения точки.

for(DWORD i=0;i<NumPoints;i++)

ClothPoints[i].m_vecPos = ClothPoints[i].m_vecOriginalPos;

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

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

Добавление дополнительных пружин

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

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

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

Весь секрет в том, что чем больше пружин содержит меш, тем жестче становится одежда. Все правильно - добавив еще несколько пружин, вы можете заставить одежду мяться и изгибаться вместо того, чтобы распадаться на непрочные группы вершин. Конечно же, важным является положение пружин, так что посмотрите еще раз на рис. 13.4, чтобы понять, что необходимо сделать. На рис. 13.5 вы видите новый меш,

вкоторый добавлено несколько новых пружин.

Имитирование одежды и анимация мешей мягких тел

393

Точки одежды

Пружины

одежды

Грани полигона

Рис. 13.4. Набор пружин, созданный из ребер многоугольников изображенного меша

Соединения пружин

Рис. 13.5. Теперь меш одежды имеет набор соединенных между собой пружин, которые расположены на его граня

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

Соседние файлы в предмете Программирование на C++