Параллакс звездного неба

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

Модератор: Mikle

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

Параллакс звездного неба

Сообщение Don Leno » 04.12.2016 (Вс) 6:39

Суть в том, что у меня предполагается создать несколько слоев:
1. Фон космической туманости
2. Дальние звезды
3.Ближние звезды
4. Планетарная система
и камера наведеная на это все. Вид должен получить сверху. При перемещении камеры создается эффект - ближние звезды движутся быстрее чем дальние, а фон почти недвижим.
Нужно как то показать глубину космоса. Прочитал про параллакс, решил поискать но не нашел ничего похожего на ВБ. Может кто подскажет или есть исходник такой реализации.

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

Re: Параллакс звездного неба

Сообщение Mikle » 04.12.2016 (Вс) 9:21

Не очень понятна цель. Астрономический термин "параллакс" как раз и означает, что "ближние звезды движутся быстрее чем дальние". Если так, то в чём проблема вообще? Просто двигай слои с разной скоростью.

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

Re: Параллакс звездного неба

Сообщение Don Leno » 04.12.2016 (Вс) 13:31

Основной будет камера над всеми слоями показывающая это пространство и она будет двигаться. Просто если сложить все слои и двигать камеру получиться статичная картинка над которой пролетает камера, может помнишь проект который я делал с корабликом, там как раз так и получается. Я не совсем понимаю как это сделать!!??? Слои двигать не выход, потому как они рисуются на DC, а потом вырезается видимая область (размером в разрешение экрана) и рисуется на Пиктуребоксе.
Вот были раньше наброски:
(Внимание сразу извиняюсь за корявость кодов и внешний вид тестовых проектов!)
З.Ы. Это старые проекты, но надеюсь они дадут понять суть вещей)))
У вас нет доступа для просмотра вложений в этом сообщении.

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

Re: Параллакс звездного неба

Сообщение Don Leno » 04.12.2016 (Вс) 13:34

Получается все зависит от положения камеры и положения объектов на слоях, но как это сделать ума не приложу! :(

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

Re: Параллакс звездного неба

Сообщение Хакер » 05.12.2016 (Пн) 6:27

Don Leno писал(а):Прочитал про параллакс, решил поискать но не нашел ничего похожего на ВБ.

Неправильно. Надо было решить не поискать, а решить подумать.

И вообще, весь вопрос задан целиком неправильно. Правильно было спрашивать так:
Я пишу игру-арканоид. Всё происходит в двух измерениях, то есть игра двухмерная, но хочется создать иллюзию глубины пространства. Никакими готовыми движками я не пользуюсь, всё рисую вручную.

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

Теперь перейдём к тому, что такое «камера»? Это не более, чем абстракция и условность, которую удобно использовать при размышлении и программировании с точки зрения высокого уровня. Высокого — в данном случае означает уровень, когда рассматриваются вопросы игровой логики; низким уровнем в таком случае считается уровень, отвечающий за отрисовку.

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

Если речь идёт о двухмерной игре, то это просто пара координат (X,Y), которая как бы соответствует положению виртуального зрителя, в том смысле, что если какой-то объект игрового мира имеет те же координаты (X,Y) то он у пользователя отображится по центру экрана.

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

И если кто-то говорит «камера двигается влево», то это означает просто что кадр-за-кадром все отрисовываемые спрайты двигаются вправо.

Раз ты хочешь получить вспевдо-глубины, значит тебе нужно при меремещении камеры на величину D, двигать разные слои не на D, а на на меньшую величину (сдвига), причём чем более «глубокий» слой, тем меньше он сдвигается.

Слой, который отождествляется бесконечно удалённые объекты, если такой есть (или если бы такой был) не должен передвигаться вообще. А слой, который лежит на той же глубине, что и воображаемая камера, должен перемещаться на D.

Тогда можно ввести некий коэффициент, пропорционально которому будет двигаться каждый слой. Для бесконечно далёкого слоя этот коэффициент будет равен 0, для абсолютно близкого — единице.

Дальше при отрисовке нужно вычислять смещение каждого слоя по форуме —k · CamPosition и рисовать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Параллакс звездного неба

Сообщение Don Leno » 05.12.2016 (Пн) 16:05

Хакер, большое тебе спасибо))
Буду пробовать твои размышления на практике)))

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

Re: Параллакс звездного неба

Сообщение Don Leno » 08.01.2017 (Вс) 17:00

Хакер, пришел к тебе с вопросом:
Создал небольшой пример, где и создал "камеру" (т.е. добавил отдельные координаты), которая управляется через клавиатуру (примера ради). Загрузил три рисунка и присвоил им коэффициенты для сдвига. В итоге получилось немного. А что если рисунки к примеру будут не статичные, а будут двигаться по своей орбите, как тогда реализовать сдвиг?! Как сделать плавнее движение камеры? И последнее, мне необходимо будет прикреплять камеру к какому нибудь объекту (к примеру к кораблику), особенно если он двигается?
У вас нет доступа для просмотра вложений в этом сообщении.

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

Re: Параллакс звездного неба

Сообщение Mikle » 08.01.2017 (Вс) 22:12

Отвечу за Хакера.
Там у тебя неправильно всё, ну или почти всё, начиная с опроса клавиатуры с помощью KeyPress. Чтобы не было задержек и можно было опросить одновременно несколько клавиш, используй KeyUp-KeyDown с буферизацией в массиве.
В картинке планеты нет альфаканала, так же нет цвета, который можно было бы использовать в качестве ColorKey, я переделал этот файл.
Если уж тяжело вникать в Direct3D, используй хотя бы мой SR2D, это проще, чем чистый WinAPI, быстрее и больше возможностей.
Я сделал небольшой пример с управлением на стрелках, Esc - выход.
У вас нет доступа для просмотра вложений в этом сообщении.

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

Re: Параллакс звездного неба

Сообщение Don Leno » 08.01.2017 (Вс) 23:31

Mikle, спс за твой пример! Я совсем забыл про масштабирование изображения при удалении))) А насчет клавиатурного опроса - просто бегло набросал без заморочек в качестве теста.
Все рисунки я просто закинул ради теста не обращая внимания на такие мелочи как альфаканал. Прикрутить недолго)))
Мне бы суть понять как сделать паралакс на простом примере, пусть даже ручонками и на чистом Апи.
Дело в том, что твой движок конечно штука просто хорошая для меня. Но мне его еще и осваивать надо. А тем более хочется написать все самому чтобы понимать как все работает)))

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

Re: Параллакс звездного неба

Сообщение Mikle » 09.01.2017 (Пн) 13:53

Don Leno писал(а):насчет клавиатурного опроса - просто бегло набросал без заморочек в качестве теста.

Так ты же спросил:
Как сделать плавнее движение камеры?

Я и ответил, что рывки из-за KeyPress.
Don Leno писал(а):Дело в том, что твой движок конечно штука просто хорошая для меня. Но мне его еще и осваивать надо. А тем более хочется написать все самому чтобы понимать как все работает)))

Дело в том, что WinAPI или SR2D - примерно одного уровня. SR2D - это тоже что-то типа API, не на много выше уровнем. То есть "написал сам" на WinAPI или SR2D - большой разницы нет.
А уж разбираться там вообще нечего, весь твой пример можно свести к использованию четырёх методов:
Init - задание пустому спрайту размера.
LoadFromFile - загрузка спрайта из файла.
Draw - расование спрайта на спрайт.
PaintToDevice - отображение спрайта на форму.
Там есть ещё TileDraw, но это просто удобная надстройка над Draw, без него можно обойтись.
Don Leno писал(а):Мне бы суть понять как сделать паралакс на простом примере, пусть даже ручонками и на чистом Апи.

В моём примере планеты движутся с разной скоростью в зависимости от расстояния до них, это то, что тебе нужно? Все расчёты там есть, для WinAPI или SR2D, не важно, расчёты одни и те же.

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

Re: Параллакс звездного неба

Сообщение Don Leno » 01.01.2019 (Вт) 13:18

Пусть тема и давняя но вопросы все равно остались.
Mikle, вообще если возможно описать формулу паралакса. К примеру есть объект с координатами x,y и камера с координатами camx,camy. Как же будет выглядеть вычисление параллакса?
К примеру что то вроде:

Код: Выделить всё
parallaxX=ObjX+CamX*koef
parallaxY=ObjY+CamY*koef


Чтобы можно данную формулу применять в любом примере

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

Re: Параллакс звездного неба

Сообщение Mikle » 09.01.2019 (Ср) 21:17

Без третьей координаты не обойтись. Как-то так:
Код: Выделить всё
parallaxX=(ObjX-CamX)*koef/ObjZ
parallaxY=(ObjY-CamY)*koef/ObjZ

Предполагается, что CamZ = 0.

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

Re: Параллакс звездного неба

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

А если CamZ будет меняться. К примеру камера будет = виду сверху то есть CamZ по сути = 0. Но к примеру, я захочу реализовать отдаление и приближение камеры ? Тогда как будет выглядеть формула?

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

Re: Параллакс звездного неба

Сообщение Mikle » 10.01.2019 (Чт) 21:43

Don Leno писал(а):Тогда как будет выглядеть формула?

Код: Выделить всё
parallaxX=(ObjX-CamX)*koef/(ObjZ-CamZ)
parallaxY=(ObjY-CamY)*koef/(ObjZ-CamZ)

Естественно, ObjZ должно быть больше, чем CamZ.

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

Re: Параллакс звездного неба

Сообщение alibek » 10.01.2019 (Чт) 23:34

Don Leno писал(а):Тогда как будет выглядеть формула?

Все «формулы» определяются подобием треугольников.
А сдвиг пропорционален соотношению расстояний до слоя и до заднего объекта.
Lasciate ogni speranza, voi ch'entrate.

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

Re: Параллакс звездного неба

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

Mikle Thanx!!! То что нужно!
alibek спс за объяснение!!!


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

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

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

    TopList