Нормаль?

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

Модератор: Mikle

Бутч
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 29.04.2005 (Пт) 17:30
Откуда: Днепр

Нормаль?

Сообщение Бутч » 29.04.2005 (Пт) 18:29

В официальной обучалке малокософта 8-му директу в примере про создание света строится простой цилиндр. При построении указывается координаты точек и нормаль:
Код: Выделить всё

For i = 0 To 49
    theta = (2 * g_pi * i) / (50 - 1)
    Vertices(2 * i + 0).postion = vec3(Sin(theta), -1, Cos(theta))
    Vertices(2 * i + 0).normal = vec3(Sin(theta), 0, Cos(theta))
    Vertices(2 * i + 1).postion = vec3(Sin(theta), 1, Cos(theta))
    Vertices(2 * i + 1).normal = vec3(Sin(theta), 0, Cos(theta))
Next

Обьясните кто небудь:
1. Чо это за normal такая? Что она делает? Насколько сильно она нужна (можно ведь и без её модели создавать)?
2. Почему её значения находятся в диапазоне от -1 до 1?
3. Почему (как пишит малокософт) она влияет на качество 3D освещения?
4. Как правильно указывать её координаты.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 29.04.2005 (Пт) 19:37

Нормаль - вектор, в идеале - единичной длины, направленный перпендикулярно поверхности объекта. Служит для рассчета освещения или отражений-преломлений. Если не использовать свет, преломления, отражения - не нужны и нормали.
Нормаль - вектор, то есть не может принимать скалярное значение от "-1" до "1", ты что-то не так понял.

Бутч
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 29.04.2005 (Пт) 17:30
Откуда: Днепр

Сообщение Бутч » 29.04.2005 (Пт) 20:12

Нормаль - вектор, то есть не может принимать скалярное значение от "-1" до "1", ты что-то не так понял.


1)Я хотел сказать не скалярное значение, а координаты только от -1 до 1. По крайней мере в .Х файлах значения MeshNormals вариируются в этом интервале.

Нормаль - вектор, в идеале - единичной длины, направленный перпендикулярно поверхности объекта. Служит для рассчета освещения или отражений-преломлений. Если не использовать свет, преломления, отражения - не нужны и нормали.


2)Как нормаль может быть направленной перпендикулярно поверхности объекта, если она указывается вместе с точкой, а не плоскостью (поверхность обьекта в твоем понимании это ведь совокупность всех плоскостей обьекта?). Ведь точка может быть частью разных плоскостей. Почему именно с точкой?

Нормаль - вектор, в идеале - единичной длины, направленный перпендикулярно поверхности объекта.


3)Почему именно перпендикулярно? Я в примераз часто встречал нормали, направленные, например, в самый центр одной плоскости, или вообще типа 0,0,1 или -1,0,0.

4)Почему иногда нормали для разных точек повторяются?

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

Сообщение d3drm » 29.04.2005 (Пт) 21:53

ИМХО, не значешь что такое нормаль, не лезь в это дело
ХЎ

Бутч
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 29.04.2005 (Пт) 17:30
Откуда: Днепр

Сообщение Бутч » 29.04.2005 (Пт) 22:49

ИМХО, не значешь что такое нормаль, не лезь в это дело


Блин, да почему сразу не лезь? :? Сомневаюсь, что у тебя с ходу получалось писать крутые движки. Любой может застопорится на месте, которое непонятно только ему. Кроме того тема Direct икса не такая популярная как, например, VBA для оффиса и ответы больше нигде не найти, кроме как на форумах. Вот я и пытаюсь выяснить для себя как правильно указывать координаты нормали. Ну помогите хоть кто-небудь :(

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 30.04.2005 (Сб) 9:56

Нормаль указывается вместе с точкой, потому что в Direct3D можно делать равномерно выпуклые-вогнутые плоскости не используя множество треугольников. У такой плоскости (точнее поверхности) нормаль в каждой точке будет разная. Если у треугольника задать разные нормали для трех вершин - нормали внутри треугольника будут равномерно интерполироваться между углами. Это, конечно, не реальная выпуклость, как в нурбс, а фейковая. Она работает для освещения и отражений, но "в профиль" треугольник все равно останется плоским.
Возьми из SDK пример с цилиндром и уменьши количество углов.
Код: Выделить всё
For i = 0 To 7
    theta = (2 * g_pi * i) / (8 - 1)
    Vertices(2 * i + 0).postion = vec3(Sin(theta), -1, Cos(theta))
    Vertices(2 * i + 0).normal = vec3(Sin(theta), 0, Cos(theta))
    Vertices(2 * i + 1).postion = vec3(Sin(theta), 1, Cos(theta))
    Vertices(2 * i + 1).normal = vec3(Sin(theta), 0, Cos(theta))
Next

Обрати внимание, что свет все равно падает на цилиндр равномерно, а углы заметны только на краях. Это потому, что в углах треугольников стоят такие нормали, какие были бы у круглого цилиндра.
Большая часть DX функций игнорирует длину нормали, а использует только направление. Поменяй vec3(Sin(theta), 0, Cos(theta)) на vec3(3 * Sin(theta), 0, 3 * Cos(theta)) - ничего не изменится. Но есть все же некоторые ф-ции, в основном D3DX математика, в которых нормаль должна быть единичной длины не завизимо от направления, иначе получается неправильный результат.

Бутч
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 29.04.2005 (Пт) 17:30
Откуда: Днепр

Сообщение Бутч » 30.04.2005 (Сб) 11:07

Спасибо, Mikle за то, что всё подробно объяснил! :D Вроде всё понял. Просто раньше использовал только готовые объекты, сделанные на максе, а теперь понадобилось чтото самому создавать. Вот только еще два вопросика появилось:

1) Как указать нормаль к точке, которая находится между двумя или даже тремя поверхностями, перпендикулярными между собой? Ну, например, для куба, насколько я понял, лучше всего будет направлять нормали в направлении от центра, верно?

2) Используется ли для улучшение качества освещения создание двух полностью идиентичных точек с двумя разными нормалями?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 30.04.2005 (Сб) 12:11

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

Бутч
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 29.04.2005 (Пт) 17:30
Откуда: Днепр

Сообщение Бутч » 30.04.2005 (Сб) 12:36

Теперь точно всё. Пасибо Mikle. Respect.

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

Сообщение d3drm » 03.05.2005 (Вт) 15:16

Бутч писал(а):
ИМХО, не значешь что такое нормаль, не лезь в это дело


Блин, да почему сразу не лезь? :? Сомневаюсь, что у тебя с ходу получалось писать крутые движки. Любой может застопорится на месте, которое непонятно только ему. Кроме того тема Direct икса не такая популярная как, например, VBA для оффиса и ответы больше нигде не найти, кроме как на форумах. Вот я и пытаюсь выяснить для себя как правильно указывать координаты нормали. Ну помогите хоть кто-небудь :(


Я имел ввиду, что если не знаешь что такое нормаль, то попытки их строить не совсем уместны.

Ну если все-таки ты не будешь ограничиваться построением простейших примитивов, то вот функция, которая рассчитывает нормаль к треугольнику:

Код: Выделить всё

Public Function CreateNormal(a As D3DVECTOR, B As D3DVECTOR, c As D3DVECTOR) As D3DVECTOR
    '------------------------------------------------------
    Dim P As D3DVECTOR, q As D3DVECTOR, N As D3DVECTOR
   
    D3DXVec3Subtract P, B, a
    D3DXVec3Subtract q, c, a
   
    D3DXVec3Cross N, P, q
    D3DXVec3Normalize N, N
   
    CreateNormal = N
    '------------------------------------------------------
End Function


Затем для сложных моделей я обычно прохожу по всем точкам и если нахожу точки с одинаковой пизицией в пр-ве, то нахожу среднее арифметическое между ними (для эффекта сглаженности).

:D
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 04.05.2005 (Ср) 17:05

Для эффекта сглаженности лучше брать не среднее арифметическое, а усреднять с весовыми коэффициентами, равными 1/(расстояние_до_центра_треугольника).


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

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

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

    TopList  
cron