Вычисление нормали

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

Модератор: Mikle

Каденов Мират
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 30.06.2003 (Пн) 9:28
Откуда: Kazahstan, U-Ka

Вычисление нормали

Сообщение Каденов Мират » 19.07.2003 (Сб) 8:09

Как вычислить нормаль треугольника чисто математически (без всяких там DirectX, OpneGL)?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 19.07.2003 (Сб) 23:51

Какие данные для этого есть, координаты вершин, или еще что-нибудь?

Каденов Мират
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 30.06.2003 (Пн) 9:28
Откуда: Kazahstan, U-Ka

Сообщение Каденов Мират » 20.07.2003 (Вс) 6:58

Входные данные такие - координаты (x,y,z) трех вершин. Выходные данные - два угла (a,b) нормали.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 21.07.2003 (Пн) 2:43

Надыбал я у себя на старых дисках перевод с английского, не совсем четкий, но понятный:Плоскость имеет нормаль и так же нормали в вершинах. Прежде, чем мы можем вычислить нормаль для трех вершины на плоскости, мы должны вычислить лицевую нормаль вначале. Мы делаем это, при помощи по точечного умножения разниц значений x, y и z. Это походило бы на это в коде:

nx = ((y1-y2)*(z1-z3))-((z1-z2)*(y1-y3))
ny = ((z1-z2)*(x1-x3))-((x1-x2)*(z1-z3))
nz = ((x1-x2)*(y1-y3))-((y1-y2)*(x1-x3))

Это возвращает точку в 3D пространстве, которая выражает точку направления. Это направление от начала (0,0,0) к точке нормали. Эта линия, которая могла бы быть сделана из этих точек, является нашим направлением. Это значение нормали, которое мы теперь нашли, можно использоваться в нашем коде, но это не очень удобно. Так как нормаль - это только направление, не важно, где в 3D пространстве точка нормали помещена, и как далеко она от (0,0,0). Пример - точка нормали (1000,0,0). Эта точка имеет то же самое направление как и точка нормали (1,0,0). Фактически, при хранение нашей длины нормали, равной единице удобнее, когда мы хотим вычислять углы между нормалями. Но как мы получим нашу векторную длину, чтобы она равнялась единице? Простой, мы делим ее на длину. Теперь, мы находим нашу длину и делим значения, говоря:

length = Sqr((nx*nx)+(ny*ny)+(nz*nz))
nx=nx/length
ny=ny/length
nz=nz/length

Это так для лицевых нормалей, но как относительно нормалей вершин, мы все еще не изучили это однако. Хорошо, что мы просто имеем теперь, экран с вектором нормали под углом 90 градусов. Поэтому, в конечном счете, нормали вершины должны наследовать то же самое правило. Но как мы определим, где 90 градусов из точки, этофактически любое направление вообще. В чем мы нуждаемся здесь, в объекте, у которого все нормали поверхностей вычислены. Затем для каждой вершины мы пробегаем через все поверхности, и выясняем, "использует" ли эта поверхность текущую вершину. Если это так, Вы прибавляете нормаль поверхности к нормали вершины, делайте то же самое со следующей, и так далее. Когда это выполнено, Вы делите нормаль вершины на число "обращений", которые Вы имели прежде (сколько плоскостей использовали эту вершину). Это означает, что нормаль в результате - нормаль, расчитаная из нормалей, которые стоят на 90 градусов на плоском, и следовательно нормаль в результате имела бы прямой угол. Фактически, Вы можете только говорить о прямом угле, не имеется никакого способа сообщать есть или нет, нормальный вектор указывает кооректно, так как каждое направление - прямое направление. Однако, нормали поверхности могут указываться двумя способами, которые противоположны. Это только приводит к противоположной нормали, т.е. (0,0, -1) - напротив (0,0,1) и так далее. Это не делает никакого большого вреда, и это не делает счастливо совершенно часто.

Каденов Мират
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 30.06.2003 (Пн) 9:28
Откуда: Kazahstan, U-Ka

Сообщение Каденов Мират » 21.07.2003 (Пн) 6:34

:shock: Круто :D А если серьезно, то большое спасибо, а то ведь у меня из-за это задачки весь проект стоит http://bbs.vbstreets.ru/viewtopic.php?t=2300

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 21.07.2003 (Пн) 7:37

Созрел тут вопросик.
Можно ли в DirectX создавать и использовать плоскость с двумя нормалями (чтобы была видима с двух сторон)?

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

Сообщение Mikle » 21.07.2003 (Пн) 8:40

А
d3dDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
не подходит? Или я не понял вопрос.

Каденов Мират
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 30.06.2003 (Пн) 9:28
Откуда: Kazahstan, U-Ka

Сообщение Каденов Мират » 21.07.2003 (Пн) 10:00

Ну, про двухсторонний треугольник даже не знаю, но М-софтовцы скорее всего предусмотрели такую необходимость. Например в 3dsmax'е где-то такое было. Не думаю, что 3dsmax программно эмулировал двухстороннесть.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 21.07.2003 (Пн) 23:50

Спасибо, работает. Только жаль, что в D3DRM подобной опции нет (или я просто не нашел).

Stanly
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 18.02.2005 (Пт) 22:59

Сообщение Stanly » 18.02.2005 (Пт) 23:15

>>Это только приводит к противоположной нормали, т.е. (0,0, -1) - напротив (0,0,1) и так далее. Это не делает никакого большого вреда

Не знаю про OpenGl, но с Direct3D грань видно толлько с той стороны, куда направлен вектор нормали. Был бы очень благодарен, если б вы помогли мне решить связанную с этим проблему: я сделал загрузчик из формата 3ds(в нем нет информации о нормалях). Прощитал саму нормаль я именно так как у вас тут написанно(векторно произведение). Теперь дело осталось в выборе знака нормали(переворачивать его или нет). Если все нормали оставить, как есть - половина граней видны не с той стороны.

Что делать? По какому принципу переворачивать нормали? Заранее благодарю!

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 19.02.2005 (Сб) 8:22

Stanly писал(а):... Если все нормали оставить, как есть - половина граней видны не с той стороны.

Что делать? По какому принципу переворачивать нормали? Заранее благодарю!
Интересно! А если без нормалей, то вообще ничего не рендерит? Нормали, как я понимаю, указываются для определения Dx'ом как освещен треугольник и в зависимости от нормали он его освещает.... А вот чтоб нормаль влияла на рендеринг - впервые слышу.... :roll: З.Ы. Может я че не так понял? :roll:


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

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

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

    TopList