Трансформация нормалей

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Трансформация нормалей

Сообщение GLEB » 24.04.2006 (Пн) 20:02

Всем привет!
Продолжаю разбирать скелетную анимацию моделей HL и вот с какой проблемой столкнулся. При каждом кадре анимации изменяется положение вершин. А нормали не трасформируются, в результате получается так: если модель была освещена сверху, а затем была перевернута при анимации, то верхняя часть становится темной, а нижняя освещенной. Пробовал заново пересчитывать нормали, но результат становится не тем что надо, да на производительность эти рассчеты неплохо влияют. Может их как-то можно изменить, зная предыдущее и новое положение вершин?

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 25.04.2006 (Вт) 4:12

вообще по идеи ничего с нормалями делать не надо, если все трансформации происходят через матрицы а не заменой координат вертексов, то все должно быть нормально.
ХЎ

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 25.04.2006 (Вт) 6:01

вообще по идеи ничего с нормалями делать не надо, если все трансформации происходят через матрицы а не заменой координат вертексов

Как раз трансформации происходят путем замены координат вертекса.
А пересчитывать нормали через каждый кадр анимации и еще нормализовывать их - слишком накладно, так что можно сделать?

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 28.04.2006 (Пт) 12:15

Нашел!
D3DXVec3TransformNormal

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 23.05.2006 (Вт) 10:26

Подскажите, пожалуйста, что тут можно сделать?

Vert() - массив вершин, (их начальное положение).
Nodes().Absolut - матрица, полученная в результате трансформации скелета.
NewVert() - новый массив, (новое положение вершин).

Код: Выделить всё
Call TransformSkeleton ' трансформация скелета

' трансформации вершин
For i = 0 To VertexCount
   Call D3DXVec3TransformCoord (NewVert(i).Position, Vert(i), Nodes(VertNode(i)).Absolut)
Next

Call Render ' Отрисовка



Код: Выделить всё
For i = 0 To VertexCount
   Call D3DXVec3TransformCoord (NewVert(i).Position, Vert(i), Nodes(VertNode(i)).Absolut)
Next


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

Если одновременно анимируются 4 модели из HL (headcrab) - fps 35 - 40 (exe), 10 - 15 (VB IDE).
Если приведенный выше фрагмент закомментировать - fps 90 - 110 (exe).

Этот фрагмент, вставлял в Сишную DLL, оптимизированную на макс. скорость - выиграл около 5 кадров.

В HL при подобной ситуации (4 модели) - fps 70 - 75.

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


d3drm
У меня как раз замена ветексов, в просмотрщике моделей HL, тоже, как в самой HL - не знаю, а как сделать через матрицы в моем случае.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

    TopList