Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: niXman от Ноябрь 24, 2009, 01:03



Название: Наложение картинки на картинку, и еффект 3D
Отправлено: niXman от Ноябрь 24, 2009, 01:03
В общем есть некое изображение карты.
Я программно рисую вот такую хрень:
(http://pic.ipicture.ru/uploads/091123/xz7ATnx5Tl.png)

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



Название: Re: Наложение картинки на картинку, и еффект 3D
Отправлено: Igors от Ноябрь 24, 2009, 02:44
В общем есть некое изображение карты.
Я программно рисую вот такую хрень:
(http://pic.ipicture.ru/uploads/091123/xz7ATnx5Tl.png)

Как мне ее положить на карту, с видимостью перспективы. Никогда не работал с 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" :)  Ну и картинка нужна побольше, на той хрени что у Вас не разгонишься



Название: Re: Наложение картинки на картинку, и еффект 3D
Отправлено: niXman от Ноябрь 24, 2009, 03:20
Огромное спасибо! Попробую разобраться.

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


Название: Re: Наложение картинки на картинку, и еффект 3D
Отправлено: Igors от Ноябрь 24, 2009, 04:05
На сколько больше? А что будет не так на маленькой картинке?
Полезут "зубы", перенос пикселей не гарантирует что все будет заполнено на выходной картинке. Имеет смысл увеличить оригинал (напр хотя бы до 260х200)  трансформировать его в этом разрешении и результат уменьшить до исходного. Вообще сам исходный имедж слишком мал чтобы делать что-то с пикселями - надо хотя бы в полтора раза больше


Название: Re: Наложение картинки на картинку, и еффект 3D
Отправлено: niXman от Ноябрь 24, 2009, 04:11
Цитировать
хотя бы до 260х200
Ок, так и сделаю.