Панорама вместо перспективы

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

Модератор: Mikle

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Панорама вместо перспективы

Сообщение VT » 23.06.2006 (Пт) 2:43

Все 3d игры производят преобразование перспективы. При этом угол обзора, естественно, не может быть больше 180 градусов (близко к 180 градусов - это будет очень необычная и чересчур объемная картинка).

Однако угол обзора глаза примерно 180 градусов, даже без учета того, что он может вращаться. (конечно, с полным разрешением у глаза угол обзора маленький, но все-таки)

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

Подскажите, есть ли стандартные средства создания панорамы или это нужно делать какими-нибудь хитрыми приемами?

Желательно OGL, так как о нем я хоть представление имею, а про ДиректИкс вообще совсем ничего не знаю

Пример рисунка панорамы:
Изображение

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

Сообщение Mikle » 23.06.2006 (Пт) 18:44

VT
Давай определимся, что ты имеешь ввиду под термином панорама. Я так понял, что геометрия сцены так же, как и в перспективе, проецируется по лучу, направленному от камеру к отображаемой точке, но отображение идет на на плоский BackBuffer, а на фрагмент цилиндра, или сфероида? Но как этот фрагмент проецировать на экран, который так, или иначе, плоский?

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 23.06.2006 (Пт) 23:41

Вот как на рисунке. То есть считая (виртуально), что экран свернули в трубочку вокруг головы юзера. То бишь цилиндрическая панорама.

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.06.2006 (Сб) 2:17

Насколько я понимаю, соответствующий пример в DirectX SDK называется FishEye.

Programming Notes
=================
The scene is actually rendered into the surfaces of a cubemap (rather than the back buffer). Then, the cubemap is used as an environment-map (see the CubeMap sample for more information about cube-mapping) to reflect the scene in some distorted geometry...in this case, some geometry approximating a fish eye lens.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 24.06.2006 (Сб) 2:28

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.06.2006 (Сб) 2:34

http://fish.kust.ru/fish_eng/Articles/vision.htm писал(а):Рыбы обладают панорамным зрением: они видят в нескольких направлениях одновременно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Mikle » 24.06.2006 (Сб) 13:04

GSerg
Рыбы обладают панорамным зрением

За счет того, что глаза два, а так в том примере просто очень широкоугольная перспектива. Кроме того там на Managed DX.
VT
В принципе можно сделать рендер на несколько вертикальных фейсов, а потом развернуть их на экране, думаю штук восемь хватит.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.06.2006 (Сб) 13:15

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Mikle » 24.06.2006 (Сб) 14:06

Объектив «рыбий глаз»



- объектив с очень коротким фокусным расстоянием и, следовательно, с очень широким углом зрения (до 200º). Характеризуется большим искажением перспективы, что иногда используют для создания специальных эффектов


Объекти́в — оптическое устройство, равнозначное собирающей линзе, проецирующее изображение на плоскость.

Сверхширокоугольный объектив («рыбий глаз») — объектив, у которого угол изображения больше 140° или даже 180°. Имеет очень большие геометрические искажения и используется, в основном, для художественной съёмки.

Это по этим ссылкам написано. Подтверждает мою точку зрения, только не понятно в первой цитате, как достигается угол до 200º. Разве что за счет того, что линза выпукла, и на нее попадает свет даже сзади. Тогда действительно будут отличия от проекции на плоскость.

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 24.06.2006 (Сб) 14:42

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

Осталось разобраться, как эти фейсы делать в OGL, для этого надо для начала попрактиковаться с OGL. А так как времени у меня на это сейчас нет (сессия), я этим займусь позже.
Всем спасибо.

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

Сообщение Mikle » 24.06.2006 (Сб) 17:01

VT
Тут есть траблы со скоростью, множественное переключение RanderTarget сурфейсов само по себе процесс не дешевый, но! Каждый вертекс, соединенный линией с другим вертексом, лежащим в другом сурфейсе, будет просчитываться дважды, а то и большее кол-во раз, если полигон достаточно большой. То есть во столько раз больше будет выполняться вертексный шейдер. Плюс фрустум куллинг - тоже процесс не бесплатный, а придется его выполнять по кол-ву сурфейсов.
Второй вариант.
Можно написать вертексный шейдер, проецирующий ветрексы по правилам перспективы, но! При ортогональной или перспективной проекциях прямая линия ВСЕГДА отображается в прямую (либо точку). И DX и Ogl основаны на этом, то есть они сначала выполняют вертексный шейдер, проецирующий как-то геометрию на экран, а потом уже рисуют на этих вертексах треугольники, ведь раз прямая остается прямой, треугольник останется треугольником. А в панораме прямая преобразуется в кривую, и мы в результате получим зазоры междуполигонами.
Третий вариант.
Рендерить геометрию как обычно широкоугольной проекцией, но В ТЕКСТУРУ, а потом отображать эту текстуру на BackBuffer с использованием нормал мэпа, вносящего соответствующие искажения (такую текстуру несложно приготовить заранее).
И четвертый вариант, для тех, у кого не пройдет третий из-за того, что не поддерживается бамп - так же рендерим в текстуру, но вместо нормал мэпа используем EnvironmentTextureMapping на регулярную сетку с нормалями, соответствующими нормал мэпу третьего варианта.

ЗЫ. Интересная задачка, пол дня ни о чем другом не думал!

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 24.06.2006 (Сб) 20:47

Лично мне больше всего по душе первый метод. Вопрос лишь в том, удастся ли мне достаточно гладко склеить полоски, чтобы места склейки не выделялись.

Второй метод я понял не катит никак.

Третий ограничивает угол зрения 180-ю градусами. И вообще не очень понятно.. кажется потеряю четкость по середине.
Четвертый - нормально... но трудновато будет искажение реализовать (я вообще не знаю, как реализовыватьтакого рода преобразование)

Образовалась идея гибридного: отрендерить всю сцену как environment на грани куба (четвертый метод), а затем методом разрезания (первый метод) отрендерить этот environment на экран в нужной панораме. Это исключит перерасчет геометрии сцены для каждой полоски.

Чщерт, когда же к сессии готовиться : (

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.06.2006 (Вс) 5:40

Mikle писал(а):И четвертый вариант, для тех, у кого не пройдет третий из-за того, что не поддерживается бамп - так же рендерим в текстуру, но вместо нормал мэпа используем EnvironmentTextureMapping на регулярную сетку с нормалями, соответствующими нормал мэпу третьего варианта.


GSerg писал(а):
Programming Notes
=================
The scene is actually rendered into the surfaces of a cubemap (rather than the back buffer). Then, the cubemap is used as an environment-map (see the CubeMap sample for more information about cube-mapping) to reflect the scene in some distorted geometry...in this case, some geometry approximating a fish eye lens.


:)

В SDK же есть пример... даже если на на managed, всё равно принцип можно посмотреть. К тому же, разве этого нет в SDK 8.1?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Mikle » 25.06.2006 (Вс) 13:50

GSerg
В 8.1 этого нет. Кроме того "rendered into the surfaces of a cubemap " - это шестикратный рендер, уж лучше применить первый вариант. Сравни быстродействие CubeMap с SphericalMap в .net SDK.
Я лично склоняюсь к третьему-четвертому вариантам.
VT
Четкость потеряется, если использовать недостаточное разрешение.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.06.2006 (Вс) 14:48

Cube в 7 раз медленнее.
Но при этом всё же 240 fps, и картинка выглядит намного лучше, чем в sphere...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Mikle » 25.06.2006 (Вс) 15:08

Вот-вот! В 7 раз. При том, что там только две модели (самолет и чайник) и задний план уже на готовой текстуре. Но плюс в том, что в реалтайм можно рендерить отражения от подвижных предметов. Я же предлагаю с помощбю бампа соответствующим образом исказить карту Sphere отражений.
VT
Тебе точно нужно больше 180 градусов? Стань спиной к стене, разве ты стену видишь?

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 25.06.2006 (Вс) 22:23

Я как-то даже ставил подобный эксперимент. Стену не разобрать. Но если поставить две руки слева и справа и шевелить пальцами, то движение заметно.
А вообще панораму можно сделать и на 360 градусов (и даже еще больше, но уже бессмысленно будет)
А с учетом вращения глаз зато видно примерно 210 градусов. В играх же перспектива раскрывает (точно не знаю) где-то всего лишь 90 градусов.

Появилась идея сделать еще более интересную проекцию.
Берется поверхность сферы
На нее проецируется окружение.
А на зкран переводим так: расстояние от центра экрана до точки на нем пропорционально углу отклонения от направления взгляда, а направление на точку экрана задает направление для отсчета того самого улга, только что упомянутого.

И это реализуемо, наверно, только методом №4. А в пределе малых углов обозрения это будет очень смахивать на обычную перспективу.

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

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

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

VT
Третий вариант от четвертого отличается только тем, что использует пиксельный конвейер там, где четвертый - вертексный. Смысл у нормал мэп текстуры и у рег. сетки с нормалями один и тот же.


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

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

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

    TopList