Russian Qt Forum
Ноябрь 23, 2024, 07:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кубическая панорама  (Прочитано 3699 раз)
Snake174
Гость
« : Январь 23, 2014, 08:16 »

Всем привет.
Имеется кубическая панорама (развёртка куба), построенная из 6 изображений.
Как можно из этой развёртки получить обратно 6 изображений (стороны куба)?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Январь 23, 2014, 09:18 »

Есть такой формат изображения "vertical (horizontal) cross", выглядит как крест, пропорции 3:4
Утилиты переводят его в сферическую карту и обратно, а вот про 6 отдельных - не помню. В принципе
QImage::copy - делов на неск минут
Записан
Snake174
Гость
« Ответ #2 : Январь 23, 2014, 13:36 »

Спасибо что откликнулись.
QImage::copy() - это не то. При построении панорамы изображение искажается и простым копированием получатся не исходные изображения, а немного другие.
Утилита - это конечно хорошо, но мне бы как-нибудь программно нужно сделать. Сколоко ни гуглил, так и не нашёл никаких формул, только программы.
Front

Right

Back

Left

Top

Bottom

Панорама
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Январь 23, 2014, 14:14 »

Так у Вас сферическая панорама 2:1. Тогда можно утилитой перевести ее в vertical cross и оттуда легко нарезать. Или писать самому, придется немного повозиться. Для каждого пикселя (x, y) сначала находите 2 угла
Код:
theta = (y - middle_y) / size_y) * PI;
phi = (x - middle_x) / size_x * PI * 4;
Потом из полярных в декартовы
Код:
x1 = cos(theta) * sin(phi)
y1 = sin(theta);
z1 = cos(theta) * cos(phi)
Дальше длинный/нудный switch, расписывать не буду, смысл такой: напр z1 по модулю оказалось максимальным - тогда если z1 < 0, то это задняя стенка куба, а если z1 > 0 то передняя. Аналогично если maxX > 0 то правая стенка, иначе левая.

Когда узнали стенку, делите x1, y1, z1 на макс модуль и отбрасываете ненужную координату, напр передняя стенка - остаются только x и y. Переводите их в координаты имеджа.

Ну и конечно все это для приличных картинок (хотя бы 2k x 1k), на тех что Вы показали ничего хорошего не получить
Записан
Snake174
Гость
« Ответ #4 : Январь 23, 2014, 14:36 »

И на этом спасибо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Январь 23, 2014, 17:25 »

И на этом спасибо.
Не наблюдаю энтузиазма  Улыбающийся
Кстати я рассказал "наоборот" (сам только сейчас понял), Вам нужно начинать со сторон кубика и мапиться в панораму.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.