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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наложение картинки на картинку, и еффект 3D  (Прочитано 5210 раз)
niXman
Гость
« : Ноябрь 24, 2009, 01:03 »

В общем есть некое изображение карты.
Я программно рисую вот такую хрень:


Как мне ее положить на карту, с видимостью перспективы. Никогда не работал с 3D. Даже не знаю как такое реализуется.

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

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Ноябрь 24, 2009, 02:44 »

В общем есть некое изображение карты.
Я программно рисую вот такую хрень:


Как мне ее положить на карту, с видимостью перспективы. Никогда не работал с 3D. Даже не знаю как такое реализуется.
Перспективное изображение вычисляется так

Код:
x_screen = x * focal / z;  
y_screen = y * focal / z; 

Где (x, y, z) - 3D координаты, и focal - параметр 3D камеры, чем меньше - тем больше эффект перспективы и угол зрения. Поскольку реальных 3D данных у Вас не видно - подделайте их. Проходите картинку пиксель за пикселем, и заносите цвет пикселя в новую картинку по пересчитанным x, y. Например

Код:
QImage src, dst;
...
// create and fill images
...

int i, j, w = src.width(), h = src.height();
float cntrX =  w * 0.5f;
float cntrY =  h * 0.5f;
float focal = w * 0.75f; 
float z = w;
for (j = 0; j < h; ++j) {
 int y = (int)((j - cntrY) * focal / z + 0.5f) + cntrY;
 if (y < 0 || y >= h) continue;
 for (i = 0; i < w; ++i) {
   int x = (int)((i - cntrX) * focal / z + 0.5f) + cntrX;
   if (x < 0 || x >= w) continue;
   dst.setPixel(x, y, src.pixel(i, j));
 }
}
Это пока та же картинка смаштабленная относительно центра. Теперь крутите что-нибудь с z, например

z = w + h - j (в цикле)

И получите что-то типа титров в "Star Wars" Улыбающийся  Ну и картинка нужна побольше, на той хрени что у Вас не разгонишься

Записан
niXman
Гость
« Ответ #2 : Ноябрь 24, 2009, 03:20 »

Огромное спасибо! Попробую разобраться.

Цитировать
картинка нужна побольше, на той хрени что у Вас не разгонишься
На сколько больше? А что будет не так на маленькой картинке?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Ноябрь 24, 2009, 04:05 »

На сколько больше? А что будет не так на маленькой картинке?
Полезут "зубы", перенос пикселей не гарантирует что все будет заполнено на выходной картинке. Имеет смысл увеличить оригинал (напр хотя бы до 260х200)  трансформировать его в этом разрешении и результат уменьшить до исходного. Вообще сам исходный имедж слишком мал чтобы делать что-то с пикселями - надо хотя бы в полтора раза больше
Записан
niXman
Гость
« Ответ #4 : Ноябрь 24, 2009, 04:11 »

Цитировать
хотя бы до 260х200
Ок, так и сделаю.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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