Обработка 2д картинки

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

Модератор: Mikle

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Обработка 2д картинки

Сообщение Don Leno » 23.03.2015 (Пн) 22:14

Здравствуйте.
Учусь работать с графикой на ВБ6. И взял для задачи создать анимированую планету на космическом фоне.
Вся графика состоит из размеров 128*128 и 360 кадров анимации вращения планеты. Если грузить все кадры как stdPicture и накладывать например в PictureBox через BitBlt, то жрет память неимоверно. Решил подойти к задаче с другой стороны. Не грузить 360 кадров, а создавать их по мере необходимости кадра.
К примеру, есть текстурка планеты и альфа маска (белый шар на черном фоне). Наложить это дело не проблема. Не получается сделать эффект сферы. Чтобы было более правдоподобно похоже на 3д планетку)))
Вопрос: Как сделать эффект сферизации?

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Обработка 2д картинки

Сообщение The trick » 23.03.2015 (Пн) 23:00

Вообще лучше Direct3D заюзать для таких целей. Если очень хочется то можно попробовать сымитировать вращение. К примеру возьми за основу вот этот код и искажай картинку. К примеру двигай ее слева направо, однако картинка должна циклично повторятся - это даст иллюзию вращения.
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 23.03.2015 (Пн) 23:06

Спасибо за реализацию! Это то что нужно. Мне нужна была именно иммитация а не точный эффект!! Осталось правда вырезать необходимую функцию и поработать с ней. Вопрос я просто мельком запустил проект, а функция примет формат рисунка как stdPicture?

И если можно функцию с работой над картинкой. А то я несколько часов потрачу на вырезание необходимого...если можно конечно?)))

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

Re: Обработка 2д картинки

Сообщение Mikle » 24.03.2015 (Вт) 9:28

Don Leno писал(а):Вся графика состоит из размеров 128*128 и 360 кадров анимации вращения планеты.

А можно выложить этот контент? Тогда будет легче сообразить, чего там не хватает.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 24.03.2015 (Вт) 20:20

Ссори контента нет((( Пока просто заранее начал продумывать всю работу и понял что это не есть хорошо... Но если надо сделаю

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Обработка 2д картинки

Сообщение Хакер » 24.03.2015 (Вт) 20:35

Перенесено в раздел «Мультимедия».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Обработка 2д картинки

Сообщение Mikle » 24.03.2015 (Вт) 23:59

Don Leno писал(а):Ссори контента нет((( Пока просто заранее начал продумывать всю работу и понял что это не есть хорошо.

А откуда тогда такое заключение:
Don Leno писал(а):Наложить это дело не проблема. Не получается сделать эффект сферы. Чтобы было более правдоподобно похоже на 3д планетку

Если даже ещё не пробовал?

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 25.03.2015 (Ср) 4:05

Потому что я уже пробовал и как то реализовывал проект где через БитБлт Накладывал на текстуру альфа маску и сверху дополнительно через АльфаБленд Текстурку сферки, но эффект не получился! Также пробовал и сделал в 3д максе планету и сделав анимацию вращения на 360 градусов - отрендерил 360 картинок и потом создавал анимацию все на том же битблт! К сожалению проекты не сохранились((( Но опыт полученный остался))))

P.S. Mikle можешь помочь, я в исходнике не могу все никак функцию вырезать и приучить ее работать с простым Пиктуребокс. Там коддинга больше для формы, чем создание самого эффекта. Буду оч признателен! (Исходник про который говорю - это ссылка Trick'а)

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

Re: Обработка 2д картинки

Сообщение Mikle » 25.03.2015 (Ср) 9:13

Если сделать многокадровую пререндеренную анимацию, то всё должно получиться нормально, никаких эффектов, типа линзы, дальше уже не требуется.
Что-то вроде линзы применяют тогда, когда изображают вращение с помощью подобной текстуры:
Изображение
Но и тут обычная линза не подходит, тут нужна линза, которая искажает масштаб по горизонтали, но не по вертикали.
Don Leno писал(а):(Исходник про который говорю - это ссылка Trick'а)

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

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

Re: Обработка 2д картинки

Сообщение Mikle » 25.03.2015 (Ср) 11:15

Вот я сделал на SR2D пример анимации с такой текстурой, там же отдельным проектом генератор карты нормалей для такого случая.
Как это сделать на WinAPI (и можно ли), я даже не в курсе.
У вас нет доступа для просмотра вложений в этом сообщении.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 26.03.2015 (Чт) 2:08

Mikle Спасибо за помощь и превосходный пример! А про горизонтальное масштабирование я даж как то не подумал.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 26.03.2015 (Чт) 18:33

Хм, а у меня получилось и с простым эффектом линзы))) Только осталось добавить светотень и вполне похоже будет на планету!)))

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

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

Re: Обработка 2д картинки

Сообщение Mikle » 26.03.2015 (Чт) 23:20

Это всего лишь статика, а как оно в движении выглядит?

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 27.03.2015 (Пт) 4:20

Вот проект с готовой анимацией:
У вас нет доступа для просмотра вложений в этом сообщении.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Обработка 2д картинки

Сообщение Jack Ferre » 27.03.2015 (Пт) 7:35

Не похоже, что сфера вращается. Будто линза летит над Землей.

Оцените разницу:
Sphere.png
У вас нет доступа для просмотра вложений в этом сообщении.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 27.03.2015 (Пт) 14:50

Может кто нить знает еще какие нить способы реализации, кроме приведенного мною и Mikle?
И кстати, Mikle, а разве нельзя добиться этого же эффекта через GetDIBits и SetDIBitsToDevice? Как я понимаю эти функции считывают массив точек картинки и потом обработав их можно сохранить в преобразованом виде. В принципе, в исходнике The Trick так и делается. Можно ли его просто как то переписать?

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Обработка 2д картинки

Сообщение The trick » 27.03.2015 (Пт) 15:38

Можно, если никто не ответит - напишу, пока не могу.
UA6527P

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

Re: Обработка 2д картинки

Сообщение Mikle » 27.03.2015 (Пт) 15:54

Don Leno писал(а):разве нельзя добиться этого же эффекта через GetDIBits и SetDIBitsToDevice? Как я понимаю эти функции считывают массив точек картинки и потом обработав их можно сохранить в преобразованом виде. В принципе, в исходнике The Trick так и делается.

Конечно можно, я думал, что тебе само преобразование нужно сделать средствами API.
The Trick писал(а):если никто не ответит - напишу, пока не могу.

Я тоже пока не могу, но напишу, сравним :)

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 27.03.2015 (Пт) 16:34

Спасибо вам))) Буду ждать ваших примеров!!!

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

Re: Обработка 2д картинки

Сообщение Mikle » 28.03.2015 (Сб) 9:41

Вот, с утра наваял. Могут быть мелкие неточности, типа где-то 127.5 вместо 128 или наоборот.
FPS неплох даже из IDE.
Можно массив MapX() сделать As Long - FPS ещё почти удвоится, потеря качества почти незаметна.
А если размер текстуры привести к степени двойки, например, 1024*512, то в основном цикле можно избавиться от деления, вместо Mod 804 будет And 1023, это ещё заметно ускорит.

Так и сделал, второй вариант, первый не убираю, чтобы могли сравнить.

<<<<< Сообщение №3333
У вас нет доступа для просмотра вложений в этом сообщении.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Обработка 2д картинки

Сообщение The trick » 28.03.2015 (Сб) 11:23

Mikle класс!
UA6527P

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Обработка 2д картинки

Сообщение alibek » 28.03.2015 (Сб) 12:40

Почему-то угловые размеры материков уменьшаются, когда они по центру и увеличиваются, когда они по краям.
Такого не может быть, угловые размеры должны быть самыми большими в центре.
Lasciate ogni speranza, voi ch'entrate.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Обработка 2д картинки

Сообщение The trick » 28.03.2015 (Сб) 13:13

Такое будет при параллельной проекции.
UA6527P

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

Re: Обработка 2д картинки

Сообщение Mikle » 28.03.2015 (Сб) 21:58

alibek писал(а):Почему-то угловые размеры материков уменьшаются, когда они по центру и увеличиваются, когда они по краям.

Это обман зрения. Это изометрическая проекция, поэтому размер по вертикали (вдоль оси вращения) не меняется. Но размер по горизонтали к краям уменьшается, что создаёт иллюзию роста размера по вертикали.
Если имеются в виду расстояния от точки до точки, произвольного направления, то оно может к краю и увеличиться, например, от устья Амазонки до мыса Горн на краю карты расстояние больше потому, что добавляется разность расстояний от этих точек до оси вращения.
Можно с помощью скриншотов отследить, что все точки карты движутся строго горизонтально, да и из кода это должно быть видно.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 29.03.2015 (Вс) 8:54

Превосходно Mikle!!! Огромное спасибо тебе!!! Всем огромное спасибо!! Вы мне очень помогли)))

Mikle, вопрос: Что делают функции - QTimeInit и QTime?
И можешь пояснить какой массив для чего используется:
Dim Tex() As Long
Dim MapX() As Long
Dim dx() As Long
Dim Back() As Long

Просто мне нужно разобраться в исходнике чтобы понять как он работает))

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

Re: Обработка 2д картинки

Сообщение Mikle » 29.03.2015 (Вс) 10:08

QTimeInit и QTime - это надстройка над API QueryPerformanceFrequency и QueryPerformanceCounter. Это для замеров времени, более точных, чем Timer, GetTickCounter и т. п.
Dim Tex() As Long - текстура, она отличается от оригинальной картинки тем, что сплющена к полюсам. Эти расчёты нет смысла проводить в реальном времени, раз можно сделать заранее.
Dim MapX() As Long - карта, имеет размер финального изображения, определяет откуда с текстуры брать тексель для данного пикселя. В этой карте координата X, так как координата Y всегда совпадает - текстура для этого и перерассчитана. Для эффекта вращения мы добавляем к выбранному из карты X, величину XX, которая плавно уменьшается (для вращения в нужную сторону, можно было и увеличивать), из суммы берём остаток деления по модулю 1024 - And 1023.
Dim dx() As Long - массив содержащий половину ширины изображения круга для каждой строки развёртки.
Dim Back() As Long - бэкбуфер, то есть массив, куда производится рендер для последующего вывода на экран.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 29.03.2015 (Вс) 10:25

QTimeInit и QTime - А можно их вырезать из кода? Они ведь не нужны для вычисления? Ты можешь объяснить вкратце как происходит работа над текстурой. Я немного пока не допонимаю, почему 127,5(512/4=127,75 четвертая часть текстуры) зачем Арккосинус? Пытаюсь разобраться но пока не все ясно. Я хочу позже подогнать функцию чтобы она работала с текстурами любых размеров. То есть достаточно передать картинку,ширину и высоту и она автоматически просчитывала и выдавала кадр.

Все QTimeInit и QTime я вырезал из кода. Добавил переменную d, которая в цикле d=d+1 и если d=1024 Then d=0. И вообще "And 1023" в вычислении XX не нужно.

Dim Tex() As Long - текстура, она отличается от оригинальной картинки тем, что сплющена к полюсам. Эти расчёты нет смысла проводить в реальном времени, раз можно сделать заранее.

Эт как? Там же вроде каждый кадр нужно преобразовывать? Ты не мог бы схематично набросать работу над текстурой, чтоб нагляднее было?

вот как я понимаю как производится работа над текстурой, если что не так поправьте меня:
У вас нет доступа для просмотра вложений в этом сообщении.

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

Re: Обработка 2д картинки

Сообщение Mikle » 29.03.2015 (Вс) 11:08

127.5 - половина от 255, середина изображения.
Don Leno писал(а):И вообще "And 1023" в вычислении XX не нужно.

And 1023 работает быстрее, чем If XX > 1023 Then, в вычислении XX это мало что меняет, оно раз за кадр считается, но в вычислении каждого пикселя Back() оно очень важно.
Я исходил из того, что изначальная картинка - это цилиндрическая проекция (гугли "виды картографических проекций"). Такая проекция имеет всегда размеры 2/1 потому, что на карте 360* меридианов и 180* параллелей. То есть координаты на карте соответствуют углам относительно центра Земли.
На бэкбуфере мы получаем проекцию, когда тексель с координаты Y по широте попадает на координату Sin(Y) (от экватора). Но у нас цикл идёт не по исходному изображению, а по бэкбуферу, поэтому нужна обратная ф-ция для рассчёта, с какой координаты исходного изображения нужно брать тексель, чтобы поместить на координату Y бэкбуфера. Я применил не арксинус, а арккосинус потому, что они отличаются на сдвиг, я считал не от экватора, а от полюса.
По X расчёт идёт точно так же, только исходя из половины ширины исходного изображения, вторую половину мы не видим, она сзади. Поэтому тут стоит 511, хотя ширина исходного изображения 1024:
Код: Выделить всё
      MapX(x + 128, y) = 1024 - ArcCos((x + 0.5) / dx(y)) / Pi * 511

Кстати, лучше поставить не 511, а 512, это как раз та маленькая неточность, о возможности наличия которых я сразу предупредил.

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

Re: Обработка 2д картинки

Сообщение Mikle » 29.03.2015 (Вс) 11:15

Don Leno писал(а):вот как я понимаю как производится работа над текстурой, если что не так поправьте меня:

В целом верно, только мы вырезаем из исходного изображения всегда ровно половину по ширине и полную высоту.
Далее сплющиваем по закону арккосинуса, причём расчёт сплющивания по вертикали не зависит от поворота планеты, поэтому я заранее сплющил. Картинку Tex.jpg я называю "исходное изображение", а в массиве Tex() - текстура, это исходное изображение, сплющенное к полюсам.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Обработка 2д картинки

Сообщение Don Leno » 29.03.2015 (Вс) 11:48

Mikle, если тебя не затруднит, можешь зарисовать это дело. Мне легче будет это понять как и что происходит. Буду тебе очень признателен!

Еще пока разбираюсь, не понимаю как она текстура сплющена у тебя в начале и как ты высчитываешь YY?
У вас нет доступа для просмотра вложений в этом сообщении.

След.

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

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

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

    TopList