Биллбординг в OpenGl

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

Модератор: Mikle

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Биллбординг в OpenGl

Сообщение Ariman » 18.04.2005 (Пн) 3:35

Подскажите, плз, как реализовать сабж...
Меня интересует только вот этот момент: после того, как я уже получил направление "взгляда" камеры, т.е. у меня уже есть вектор, нормали к этим полигонам, как получить координаты вершин, зная центр полигона(точка пересечения диагоналей)? Полигон предстваляет из из себя прямоугольник, с известными сторонами.

Я, конечно, знаю другую реализацию - нарисовать полигон, а потом вращать его, чтобы стал параллелен плоскости отсечения..... Но она мне не понравилась. А реализация того метода, о котором я спрашиваю показалась мне странной.
Цитирую ГеймДев.ру:

Изображение
Для начала, нам необходимо узнать сам вектор направления взгляда... можно конечно отслеживать все матричные преобразования (повороты, сдвиги)... но OpenGl существенно упрощает нам нашу задачу... с помощью Glевской функции glGetfloatv() мы можем "выдернуть" текущую матрицу и достать из нее нормаль к ближней плоскости отсечения, которая и будет нашим вектором направления взгляда ;)...
..........................
Из определения биллборда следует, что вектор направления взгляда является нормалью для каждого биллборда в сцене (на рисунке с биллбордом он так и подписан - "нормаль"), а, имея нормаль и центр массы (N) частицы, мы можем найти все четыре вершины биллборда:

p1 = N + v1; p2 = N + v2;
p3 = N - v1; p4 = N - v2;

Чтобы найти вектор v1 нужно вычислить cross product от вектора нормали и любого другого взятого с потолка вектора (в нашем случае "Z"), для нахождения вектора v2 нужно найти cross product от вектора нормали и вектора v1 (не забудьте нормализовать полученные вектора).

Мне непонятно вот это:

Чтобы найти вектор v1 нужно вычислить cross product от вектора нормали и любого другого взятого с потолка вектора (в нашем случае "Z"), для нахождения вектора v2 нужно найти cross product от вектора нормали и вектора v1

Как я не прикидывал - все равно получается, что векторное произведение нормали на Z не дает один из необходимых векторов(V1)!!! Со вторым пунктом я согласен - если помножить вектор нормали на V1, то мы получим ортагональный им V2, НО: только в том случае, когда полигон - квадрат(и его диагонали пересекаются под прямым углом.

Или это я так сильно торможу??(что будет не удивительно - я с 6 часов на ногах :roll: )
Поясните мне пожалуйста......

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

Сообщение Mikle » 18.04.2005 (Пн) 10:24

А тут и нарисован квадрат, просто вид сбоку. Для прямоугольника попробуй искать не векторы полу-диагоналей, а векторы <от_центра_к_середине_стороны>. Зная центр, достаточно найти "верх" и "право", отразить их на "низ" и "лево". Ну а вектор от центра к любому углу - сумма векторов от центра к прилежащим сторонам.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 18.04.2005 (Пн) 11:16

Mikle
Это-то понятно! Меня интересует другое!
Каким образом произведение нормали к этому квадрату на вектор Z{0,0,1} дает один из искомых векторов?Я идиот! Убейте меня, кто-нибудь!
Это что же получается, если квадрат будет расположен параллельно оси Z, нормаль к нему будет совпадать с {0,0,1}, их векторное произведение будет равно 0! И тогда получается никакого квадрата не будет!(если его диагонали нулевой длины!) :roll:

Поясните мне вот это:
Чтобы найти вектор v1 нужно вычислить cross product от вектора нормали и любого другого взятого с потолка вектора (в нашем случае "Z")

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

Сообщение Mikle » 18.04.2005 (Пн) 13:18

Я так понял любой другой взятый с потолка вектор все же должен лежать в плоскости, перпендикулярной взгляду. Возможно это было где-то раньше в тексте.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 18.04.2005 (Пн) 13:38

Mikle
Не было :wink:
Бред просто - я ж говорю, человек, который прочел эту статейку напишет прогу, и будет радоваться, пока не направит камеру по оси Z.... Тогда размеры его биллбордов резко станут равны нулю...... :?
Кстати, судя по рисунку, вектор Z не лежит в плоскости биллборда.... Хотя, по 2д это трудно определить.....
А как правильно-то сделать? Как получить этот вектор???
Ну получил я направление взгляда, есть центр квадрата(коорднаты точки)..... А что дальше сделать?

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

Сообщение Mikle » 18.04.2005 (Пн) 14:00

Можно так:
Умножаешь вектор LookAt на вектор vUp. Это те вектора, что в трансформе VIEW (LookAt = VAt - VEye). Получаешь вектор вправо. Нормализуешь и умножаешь на половину ширины билборда. Прибавляешь координату центра билборда, на выходе координата середины правой стороны.
Умножаешь его на LookAt
Нормализуешь и умножаешь на половину высоты билборда.
Прибавляешь координату центра билборда, на выходе координата середины верхней (или нижней, проверь) стороны.
И т. д.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 19.04.2005 (Вт) 14:16

Mikle
Извини, можешь код показать? Я в 3Д недавно, к тому же пишу на с++.....
Меня интересует, как получить vUp...... Так что, если не сложно - кинь сюда код нахождения координат..... Все функции можешь не расписывать(ну, там, векторное произведение запиши просто CrossProd(&v1,&v2), это уж я реализую), покажи только основное.....

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

Сообщение Mikle » 19.04.2005 (Вт) 15:23

Ariman
Я могу это расписать на VB и DX8, используя математику из D3DX.
На СИ++, OpenGL переведешь? Тогда завтра выложу.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 19.04.2005 (Вт) 22:22

Ну выложи на всякий случай.....
С переводом на С++ проблем не должно возникнуть, с математикой тоже.... А вот DX->OpenGL - это я не уверен. Я ДХ вообще не знаю......

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

Сообщение Mikle » 20.04.2005 (Ср) 16:10

Тут два варианта - с фиксацией билборда по вертикали и без:


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

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

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

    TopList