Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 10, 2017 09:17:29

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

Добрый день!

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

Никакой графики, как можно было бы подумать из названия темы, (ну может быть потом допишу на PyQt) весь игровой процесс будет проходить в консоли в диалоговом режиме, как старые адвентюрные игры с локациями - запрос - ответ. Только текст.

Вопрос в том, что у меня будут не локации, а огромное пространство моря с неровным рельефом дна и береговой линии. Не хотелось бы изобретать велосипед, но я совершенно не знаю, как описать такую карту и как в ней перемещаться?

Хранить данные буду в SQLite3

Ещё раз кратко - нужно описать трехмерную карту но не нужно её отрисовывать, только перемещаться в ней по осям y x z. 3д редакторами не владею, вся работа в питоне.



ubuntu 14.04 / manjaro 16.10

Офлайн

#2 Апрель 10, 2017 09:50:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9730
Репутация: +  843  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

Schlange
Хранить данные буду в SQLite3
Начинать надо с текстового файла, иначе все эти усложнения просто время заберут.

Schlange
но я совершенно не знаю, как описать такую карту и как в ней перемещаться?
По-моему, это называет “карта высот”. Просто у тебя таблица из байтов, где в каждом высота дна в виде числа. А что там плавает ещё, должно храниться в другой таблице. И получается, что ты в этих таблицах узнаёшь, можешь ли ты проплыть, что там плавает в такой-то точке и ещё что-нибудь. Так ты можешь не утежелять карту всевозможными объектами, а просто собирать точку карты с разных таблиц, подгружая их по мере надобности.

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

Чтобы начать, сделай себе поле 2x2 и на нём всё отработай, а потом просто увеличишь его.



Отредактировано py.user.next (Апрель 10, 2017 09:52:42)

Офлайн

#3 Апрель 12, 2017 04:10:30

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

В данном случае скорее карта глубин) Например.

У меня нет навыков работы в 3д редакторе, поэтому ручками по старинке взял бумагу в клетку, нарисовал на ней форму берега и глубины в виде замкнутых фигур. Записал все координаты в файл csv: x,y,z, где координаты точек, а - z - глубина.

Логика:
если строка координат имеет глубину с положительным числом - то это форма берега или остров, отрицательная - глубина. уровень 0 - поверхность моря.

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

Совпадающие глубины (z координаты) - признак одной фигуры. Потом можно усложнить, но пока сделал так для визуального обнаружения в CSV файле разных полигонов.

Начал писать:


 import csv
filename = 'sea.csv'
with open(filename, newline='') as f:
    reader = csv.reader(f)
    try:
        for row in reader:
            print(row)
    except csv.Error as e:
        sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))


И тут понял, что не знаю что дальше делать)) Как мне в переменные загнать данные из списка, как описать карту и плавать по ней..

Гит - массив координат моря:
https://github.com/hikikomori4/sensuikan/blob/master/resources/sea.csv



ubuntu 14.04 / manjaro 16.10

Офлайн

#4 Апрель 12, 2017 05:12:22

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

Можно сделать двухмерный массив из float. Хранить можно высоты не в каждой точке, а скажем, через 10-100 и интерполировать.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Апрель 12, 2017 05:13:24)

Офлайн

#5 Апрель 12, 2017 06:07:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9730
Репутация: +  843  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

Schlange
В данном случае скорее карта глубин) Например.
Тебе надо описать морское дно математически. Для этого используются такие понятия как пространство, точка, кортеж объектов в точке. В такой-то точке пространства находится земля, в такой-то точке пространства находится вода, в такой-то точке пространства находится воздух, в такой-то точке пространства находится рыба. И дальше берётся дно и записывается в виде всех высот, которые у него есть. Таким образом ты потом для точки пространства сможешь определить, есть ли в ней земля. Твоя лодка находится в какой-то точке пространства, а рядом с этой точкой есть соседние точки, для каждой из которых можно всё определить. Плавание лодки - это перемещение из точки в точку. А перемещение из точки в точку - это изменение текущих координат точки в пространстве. (У тебя где-то всё время записано, что у такой-то точки в её кортеже объектов есть лодка.)

Schlange
И тут понял, что не знаю что дальше делать))
Поэтому надо всё делать на очень маленькой карте, иначе на большую карту всё время разработки тратишь, а потом действий никаких на ней сделать не можешь. Надо сначала механику лодки (персонажа игры) разработать, а потом уже к ней карты подключать любые.



Отредактировано py.user.next (Апрель 12, 2017 06:15:38)

Офлайн

#6 Апрель 12, 2017 09:52:55

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

PooH
Можно сделать двухмерный массив из float. Хранить можно высоты не в каждой точке, а скажем, через 10-100 и интерполировать.

У меня уже есть карта, там три значения xyz на точку пространства. Что такое интерполяция прочитал в вики. Ура, теперь я знаю это слово. По ссылке не осилил.

py.user.next
Тебе надо описать морское дно математически.

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



В математике не силён. Я занёс csv в список с вложенными списками на каждую строку - sea = list(reader) Как теперь по нему определять координаты корабля, и как реализовать проверку интерполяции (врезание в скалу например)
На карте едва больше корабля неудобно проверять маневрирование, разгон и торможение, погружение-всплытие. Я уже сделал довольно мелкую опытную карту.
корабль должен в чем-то находиться, чтобы его проверять.



ubuntu 14.04 / manjaro 16.10

Офлайн

#7 Апрель 12, 2017 11:33:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9730
Репутация: +  843  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

Schlange
и как реализовать проверку интерполяции (врезание в скалу например)
Это вот, например, у тебя лодка плывёт прямо (задано проплыть 10 точек по прямой) а там есть прямая скала под углом (поверхность скалы - это отрезок, состоящий из точек). Как узнать, пересекаются ли отрезки (отрезок пути лодки и отрезок поверхности скалы)? Вот алгоритм для определения, пересекаются ли отрезки, строится на векторном произведении.

Schlange
В математике не силён.
Значит, будешь просто плавать, как в тетрисе, без каких-то умностей. Там математики нет, просто всё время проверяются соседние клетки. Но и всё это будет работать медленно, потому что нужно будет все клетки перебирать, пока не выяснится, есть ли там пересечение с какой-нибудь из десяти скал.



Отредактировано py.user.next (Апрель 12, 2017 11:35:09)

Офлайн

#8 Апрель 13, 2017 05:09:15

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

Schlange
PooH
Можно сделать двухмерный массив из float. Хранить можно высоты не в каждой точке, а скажем, через 10-100 и интерполировать.
У меня уже есть карта, там три значения xyz на точку пространства. Что такое интерполяция прочитал в вики. Ура, теперь я знаю это слово. По ссылке не осилил.
Ну я так понял, нужно хранить карту высот. Тут проще всего для твоей задачи будет использовать равномерную сетку. Делаешь двухмерный массив arr, значение
 arr[x][y]
равно высоте. Ссылку я дал на эффективный массив из стандартной библиотеки. Он правда одномерный, но это не проблема i = x * <ширина карты> + y. Дальше, хранить высоты для каждой точки это дорого. Лучше пусть точка в массиве соответствует высоте через каждые, ну скажем, сто метров. Тогда берешь разбиваешь координаты на x` = x % <шаг> и y` = y % <шаг>. И берешь четыре точки из массива (x`, y`), (x+1`, y`), (x`, y+1`), (x`+1, y`+1) это будет ячейка размером <шаг> x <шаг>. Дальше в ней находишь билинейной интерполяцией высоту точки (x - x`, y - y`)).




Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Апрель 13, 2017 05:10:24)

Офлайн

#9 Апрель 13, 2017 06:38:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9730
Репутация: +  843  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

Schlange
У меня уже есть карта
Надо сделать карту высот, потом надо сделать множество точек пространства и потом просто сделать лодку с методами перемещения (испольнитель “лодка”).

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

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



Офлайн

#10 Апрель 22, 2017 12:50:14

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

как описать трёхмерное пространство и перемещаться в нём?

Почти реализовал сам корабль, осталась физика.
https://github.com/hikikomori4/sensuikan

Задача: генерировать дифферент на нос или корму в зависимости от изменения центра тяжести.

Есть
uboat.c_differ –тут ранится число дифферента. положительно - на нос, отрицательное - на корму, нулевое - ровный киль.
Есть две балластные цистерны по краям,

uboat.tanks
uboat.tanks

они будут влиять на дифф.

Как в зависимости от их неравномерного заполнения плавно менять дифф на определённый градус?



ubuntu 14.04 / manjaro 16.10

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version