Среда, 13 Ноября 2024, 10:41

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Помогите рачитать оффсет отражённой текстуры.
AlkoshaДата: Среда, 07 Января 2015, 15:10 | Сообщение # 1
участник
Сейчас нет на сайте
Вроде сперва не в тот раздел сунулся с данным вопросом. -> http://gcup.ru/forum/45-42481-1
Там относительно высокоуровневые движки обсуждаются. А я шаманю на SDL2.

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

Получается так, что при масштабировании отражения "съезжают"

Гиф-анимашка

Код
    SDL_Rect dstrect;
        dstrect.w=800*cum.z;
        dstrect.h=600*cum.z;
        dstrect.x=400-400*cum.z;
        dstrect.y=300-300*cum.z;
        SDL_Point center;
        center.x=400;
        center.y=300;

        SDL_SetTextureBlendMode(texTarget,SDL_BLENDMODE_BLEND);
        SDL_SetTextureBlendMode(texTarget2,SDL_BLENDMODE_BLEND);

        SDL_SetRenderTarget(renderer, NULL);
        SDL_RenderCopyEx(renderer, texTarget, NULL, &dstrect, cum.angle,
        ¢er, SDL_FLIP_NONE);

        SDL_RenderCopyEx(renderer, texTarget2, NULL, &dstrect, cum.angle,
        ¢er, SDL_FLIP_NONE);

        dstrect.y= dstrect.y+200-cum.y*2;
        dstrect.h/=2;

        SDL_SetTextureAlphaMod(texTarget2,100);
        SDL_RenderCopyEx(renderer, texTarget2, NULL, &dstrect, cum.angle,
        ¢er, SDL_FLIP_VERTICAL);


Где texTarget - бэграунд, texTarget2 = передний план, который выводится дважды, в нормальном и в зеркальном виде.
cum - класс камеры.
Вот тут нужно подобрать оффсет: dstrect.y= dstrect.y+200-cum.y*2;



И ещё.
dstrect.h/=2; - это плющит отражённую текстуру по вертикали вдвое.


Сообщение отредактировал Alkosha - Среда, 07 Января 2015, 15:21
LetsOffBrainsДата: Среда, 07 Января 2015, 16:57 | Сообщение # 2
Project SoRDeLKa
Сейчас нет на сайте
dstrect.y = dstrect.y+dstrect.h*3/4; попробуй


DungeonLordДата: Среда, 07 Января 2015, 18:08 | Сообщение # 3
Волк Игростроя
Сейчас нет на сайте
Alkosha, судя по гифке проблема, в том что в случае приближении камеры отраженная текстура залезает на основную, если я правильно понял? Вероятно это происходит из-за того, что выражение cum.y*2 начинает принимать слишком большие значения и dstrect.y становится отрицательным. Попробуй поставить условие проверки на ноль перед расчетом dstrect.y



AlkoshaДата: Среда, 07 Января 2015, 18:35 | Сообщение # 4
участник
Сейчас нет на сайте
Цитата
dstrect.y = dstrect.y+dstrect.h*3/4; попробуй

Не. Всё равно чего-то не то.


Сообщение отредактировал Alkosha - Среда, 07 Января 2015, 18:35
Snake174Дата: Среда, 07 Января 2015, 18:55 | Сообщение # 5
участник
Сейчас нет на сайте
dstrect.y= dstrect.y + 200 * cum.z - cum.y * 2 * cum.z;

Попробуй cum.z поподставлять куда-нибудь. Я так понимаю это и есть зум.


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games
AlkoshaДата: Среда, 07 Января 2015, 19:00 | Сообщение # 6
участник
Сейчас нет на сайте
Для ясности картины, попытаюсь пояснить подробнее:

Есть текстурка texTarget2 размером на весь экран (800*600), на неё рендерятся спрайты с координатами x=x-cum.x и y=y-cum.y.
Эту же текстуру флиппаю по вертикали. Но так как "отражение" должно быть в той системе координат, к которой привязана камера, надо учитывать ещё смещение камеры по Y при выводе отражённой текстуры.

Приближение\удаление камеры происходит за счёт изменения размеров этого самого texTarget2.


Сообщение отредактировал Alkosha - Среда, 07 Января 2015, 19:01
DungeonLordДата: Среда, 07 Января 2015, 19:07 | Сообщение # 7
Волк Игростроя
Сейчас нет на сайте
Alkosha,
Код
if (dstrect.y>0)
  dstrect.y= dstrect.y+200-cum.y*2;




AlkoshaДата: Среда, 07 Января 2015, 19:17 | Сообщение # 8
участник
Сейчас нет на сайте
Хыыы... Прикольная апичатка в названии темы.

Добавлено (07 января 2015, 19:17)
---------------------------------------------
По совету Снэйка уже более-менее нормально работает. Только когда камера двигается по Y, отражённая текстура немного "плывёт". Зато по Z строго на фиксированном месте , как и положено.
Может на текстуре "воды" нормально будет смотреться.

DungeonLordДата: Среда, 07 Января 2015, 19:38 | Сообщение # 9
Волк Игростроя
Сейчас нет на сайте
Alkosha, dstrect.y= dstrect.y + 200 * cum.z - cum.y * 2;



AlkoshaДата: Среда, 07 Января 2015, 20:09 | Сообщение # 10
участник
Сейчас нет на сайте
Цитата DungeonLord ()
dstrect.y= dstrect.y + 200 * cum.z - cum.y * 2;


В этом случае есть смещение при зуме.
DungeonLordДата: Среда, 07 Января 2015, 21:53 | Сообщение # 11
Волк Игростроя
Сейчас нет на сайте
Цитата Alkosha ()
В этом случае есть смещение при зуме.

Без просмотра результатов, не понятно, что там происходит. Добавьте зависимость от всех координат, по которым будет двигаться камера, в данном случае с z и y:
Код
dstrect.y= dstrect.y + 200 * cum.z * cum.y - cum.y * 2 * cum.z;




AlkoshaДата: Среда, 07 Января 2015, 23:47 | Сообщение # 12
участник
Сейчас нет на сайте
dstrect.y= dstrect.y + 10 * cum.z * cum.y - cum.y * 2 * cum.z;

ГИФ

dstrect.y= dstrect.y + 200 * cum.z - cum.y * 2;

ГИФ

dstrect.y= dstrect.y + 200 * cum.z - cum.y * 2 * cum.z;

ГИФ
HPlusDieseДата: Четверг, 08 Января 2015, 02:47 | Сообщение # 13
участник
Сейчас нет на сайте
Цитата Alkosha ()
Приближение\удаление камеры происходит за счёт изменения размеров этого самого texTarget2.

Весело.
AlkoshaДата: Четверг, 08 Января 2015, 11:38 | Сообщение # 14
участник
Сейчас нет на сайте
Цитата HPlusDiese ()
Весело.


Не пойму иронии. Вам известен иной метод?
Изначально я зумил рендерер, но он масштабируется относительно начала декаротвых координат (левого верхнего угла), то есть мне нужно было дополнительно смещать объекты на игровом поле. Рендерить всё в текстуру и после этого извращаться с ней как угодно - гораздо проще.
DungeonLordДата: Четверг, 08 Января 2015, 11:47 | Сообщение # 15
Волк Игростроя
Сейчас нет на сайте
Alkosha, данная зависимость dstrect.y= dstrect.y + 200 * cum.z - cum.y * 2 * cum.z; верная.
Единственное, что нужно сделать, чтобы отражение не наползало на оригинал - это в случае увеличения координаты по у менять знак выражения 2*cum.y*cum.z на +.




AlkoshaДата: Четверг, 08 Января 2015, 13:07 | Сообщение # 16
участник
Сейчас нет на сайте
Цитата DungeonLord ()
чтобы отражение не наползало на оригинал


Не в этом дело. Я не планирую делать так, чтоб рокИр окунался по пояс в воду. Там просто когда камера двигается по Y само отражение немного тоже двигается.

Добавлено (08 января 2015, 13:07)
---------------------------------------------
Да ладно. И так сойдёт. Слишком много времени уделяю обычному не геймплейному декору.

DungeonLordДата: Четверг, 08 Января 2015, 16:50 | Сообщение # 17
Волк Игростроя
Сейчас нет на сайте
Цитата Alkosha ()
Не в этом дело. Я не планирую делать так, чтоб рокИр окунался по пояс в воду.

Без понятие о чем речь, но дело тут в этом, судя по тому, что я увидел на гифках.
Цитата Alkosha ()
Там просто когда камера двигается по Y само отражение немного тоже двигается.

Я об этом и говорю. У меня такое ощущение, что мы на разных языках разговариваем.
Вот что примерно нужно, чтобы обойти изображенный недостаток (перехватывать начальной значение Y возможно нужно в другом месте, где объявляются все объекты, которые Вы "рендерите в текстуру", тут уж Вам виднее):




HPlusDieseДата: Четверг, 08 Января 2015, 20:02 | Сообщение # 18
участник
Сейчас нет на сайте
Цитата Alkosha ()
Не пойму иронии. Вам известен иной метод?

projection matrix
Ты ещё наверное и на FFP всё делаешь?


Сообщение отредактировал HPlusDiese - Четверг, 08 Января 2015, 20:03
AlkoshaДата: Пятница, 09 Января 2015, 20:06 | Сообщение # 19
участник
Сейчас нет на сайте
Цитата HPlusDiese ()
projection matrix


И ? чего-то не встречал в SDL-е ничего связанного с матрицами.

Цитата HPlusDiese ()
Ты ещё наверное и на FFP всё делаешь?


Что за аббревиатура? Fixed Function Pipeline ?


Сообщение отредактировал Alkosha - Суббота, 10 Января 2015, 17:24
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг