Вроде сперва не в тот раздел сунулся с данным вопросом. -> http://gcup.ru/forum/45-42481-1 Там относительно высокоуровневые движки обсуждаются. А я шаманю на SDL2.
Так вот, проблема в том, что не могу расчитать координаты отражённой текстуры.
Получается так, что при масштабировании отражения "съезжают"
Где texTarget - бэграунд, texTarget2 = передний план, который выводится дважды, в нормальном и в зеркальном виде. cum - класс камеры. Вот тут нужно подобрать оффсет: dstrect.y= dstrect.y+200-cum.y*2;
И ещё. dstrect.h/=2; - это плющит отражённую текстуру по вертикали вдвое.
Сообщение отредактировал Alkosha - Среда, 07 Января 2015, 15:21
Alkosha, судя по гифке проблема, в том что в случае приближении камеры отраженная текстура залезает на основную, если я правильно понял? Вероятно это происходит из-за того, что выражение cum.y*2 начинает принимать слишком большие значения и dstrect.y становится отрицательным. Попробуй поставить условие проверки на ноль перед расчетом dstrect.y
Для ясности картины, попытаюсь пояснить подробнее:
Есть текстурка texTarget2 размером на весь экран (800*600), на неё рендерятся спрайты с координатами x=x-cum.x и y=y-cum.y. Эту же текстуру флиппаю по вертикали. Но так как "отражение" должно быть в той системе координат, к которой привязана камера, надо учитывать ещё смещение камеры по Y при выводе отражённой текстуры.
Приближение\удаление камеры происходит за счёт изменения размеров этого самого texTarget2.
Сообщение отредактировал Alkosha - Среда, 07 Января 2015, 19:01
Добавлено (07 января 2015, 19:17) --------------------------------------------- По совету Снэйка уже более-менее нормально работает. Только когда камера двигается по Y, отражённая текстура немного "плывёт". Зато по Z строго на фиксированном месте , как и положено. Может на текстуре "воды" нормально будет смотреться.
Без просмотра результатов, не понятно, что там происходит. Добавьте зависимость от всех координат, по которым будет двигаться камера, в данном случае с z и y:
Не пойму иронии. Вам известен иной метод? Изначально я зумил рендерер, но он масштабируется относительно начала декаротвых координат (левого верхнего угла), то есть мне нужно было дополнительно смещать объекты на игровом поле. Рендерить всё в текстуру и после этого извращаться с ней как угодно - гораздо проще.
Alkosha, данная зависимость dstrect.y= dstrect.y + 200 * cum.z - cum.y * 2 * cum.z; верная. Единственное, что нужно сделать, чтобы отражение не наползало на оригинал - это в случае увеличения координаты по у менять знак выражения 2*cum.y*cum.z на +.
Не в этом дело. Я не планирую делать так, чтоб рокИр окунался по пояс в воду. Там просто когда камера двигается по Y само отражение немного тоже двигается.
Добавлено (08 января 2015, 13:07) --------------------------------------------- Да ладно. И так сойдёт. Слишком много времени уделяю обычному не геймплейному декору.
Не в этом дело. Я не планирую делать так, чтоб рокИр окунался по пояс в воду.
Без понятие о чем речь, но дело тут в этом, судя по тому, что я увидел на гифках.
ЦитатаAlkosha ()
Там просто когда камера двигается по Y само отражение немного тоже двигается.
Я об этом и говорю. У меня такое ощущение, что мы на разных языках разговариваем. Вот что примерно нужно, чтобы обойти изображенный недостаток (перехватывать начальной значение Y возможно нужно в другом месте, где объявляются все объекты, которые Вы "рендерите в текстуру", тут уж Вам виднее):
Код
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; double y_tmp=dstrect.y; // тип данных поля уточнить в описании класса SDL_Point center; center.x=400; center.y=300;