|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
15.06.2016, 10:36 | #1 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Простейшая "игра" (или симуляция)
Всем привет. Пишу сюда ради общего развития. Интересует вопрос из области 3D игр: можно ли назвать простейшей примерно следующую конструкцию - коробка, в которой я могу перемещать камеру в четырёх (или восьми) направлениях (посредством управления теми же WASD) ?
Если честно, я даже не знаю, как это правильно называется, поэтому, собственно, и пишу сюда. С чего мне начать ? Интересует не какой то движок типа 3D Unity (и подобные), а хочу попробовать написать что нибудь своё, как уже написал - ради общего развития. Работать умею разве что с GDI (+), то есть - 2D, и на него проецировать трёхмерное изображение, думаю, будет весьма накладно для компьютера, и получится нечто неадекватное. С чего мне начинать, какую литературу курить ?
Подпись ? Не, не слышал ...
|
16.06.2016, 15:44 | #2 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,883
|
В каком смысле назвать простейшей ? В плане запрограммировать ? зависит от средств реализации. Например, взяв дельфи, можно сразу прописать uses OpenGL и набросать простой пример из Краснова "Графика OpenGL в проектах Delphi" , там строк 30 своего кода и строк 50 красновского - получится коробка и камера с кнопками - несколько операций над матрицами будут в основе, работа с матрицами - несильно заумная теория - почитали да попробовали.
А если сильно охота, беретё учебник математики и пишете код представления 3хмерного простанства, моделей, видовых преобразований, проекций, растеризации, такое можно и в GDI сделать (не усложняя если), примерно как тут и не так уж слабы софтверные рендереры, зависит как напишете, если пишете несложное, то потянет с гарантией. А есть и много других инструментов, как-то ДиректХ, новые спецификации всякие, вроде Vulkan , Metal, новых шейдермоделей, по ним тоже есть всякие уроки, что-то может делаться проще, что-то сложнее, просто берёте понравившееся или более распространённое. Материалов сейчас тьма, хоть под браузеры пишите 3дсцены. Движки тоже полезно покрутить, может и понравится, но и с нуля начинать нормально, чтобы потом в движках "видеть" глубже. |
16.06.2016, 17:49 | #3 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Если мой пример - тогда, думаю, что можно; но если мою коробку наполнить какими нибудь объектами, формировать "на лету" картинки (те же BitMap), и выбрасывать их в какой нибудь ImageBox (по мере обновления проекции) - то можно получить FPS не больше 10, особенно, если кадр большой.
Подпись ? Не, не слышал ...
|
17.06.2016, 06:36 | #4 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,883
|
Так никто не говорит рендерить сложные сцены, для нескольких геометрических фигур - нормально, чтобы понять всю кухню этого будет достаточно, а Вы, на минутку, задались именно этой целью. Потом надо будет - поставите цели сложнее и возьмёте инструменты сложнее. Я это Вам сказал в том разрезе, что "начать" в 3д можно и с теми навыками, что Вы описали.
А если Вы хотите сразу получить что-то адекватное из экспериментов с любой (даже крутой) технологией - "разочарую я тебя до невозможности" © Г. Жеглов Это как бы всё самоочевидно. Дерзайте, изучайте, не вижу препонов. |
17.06.2016, 22:24 | #5 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
phomm
Решил "попробовать" воссоздать свою коробку (на C#), и застопорился на следующей проблеме: физическая нехватка ОЗУ на этапе создания трёхмерного массива. Что я делаю неправильно ? Судя по всему, неправильно задаю размеры, но тогда это уже будет масштабирование, или достаточно маленькая коробка ... В моём понимании, один элемент массива равен одному пикселю "реального" пространства; но даже кубик размерами 500x500x500 пикселей будет занимать пол гигабайта, при одном элементе в 4 байта. А это, к слову, визуально маленький кубик (в моём понимании). В догонку int'а недостаточно для передачи цвета и прозрачности, а значит, либо встроенный Color (24 байта, вся структура разжиреет в 6 раз), либо свой тип, который выглядит примерно так: Код:
P.S. Альфа-канал в структуре Particle описан пока чисто для возможности развития, если таковая имеется; пока что для меня достаточно того, что бы я имел прозрачные и непрозрачные элементы в своём пространстве.
Подпись ? Не, не слышал ...
|
18.06.2016, 03:43 | #6 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
там разреженная структура нужна, хранить регионами только.
+многие блоки можно хранить мета блоками. Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
18.06.2016, 08:34 | #7 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
Вот что у меня есть:
Код:
Опять же, что это, и как ? Я сразу заметил, что инициализировать все элементы весьма накладно; инициализируя все грани моей коробки (750x500x500) память процесса занимает 786 с лишним мегабайт. Если инициализацию элементов не выполнять, а только сделать саму коробку - будет 765 мегабайт, Так что на инициализации я много памяти сэкономлю только в том случае, если будет динамическая обработка большого количества объектов. Но всё это не имеет никакого смысла, пока мой ящик с ничем (точнее - с одними указателями) занимает 765 мегабайт. Если написать следующий код: Код:
Промерять размер для объекта Particle этой функцией не получиться - System.ArgumentException (Невозможно упаковать тип "Space.Particle" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл). Но можно предположить, что такой объект будет занимать не меньше 4 байт, плюс указатели, и прочая дичь; и это в любом случае меньше, чем стандартный Color, который держит в себе как три цветовых канала, так и альфа-канал. Для чего выделяется ещё 20 байт - знает только сама MSVS.
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 18.06.2016 в 17:21. |
18.06.2016, 08:55 | #8 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,883
|
Вам бы определиться, Вам основы "пробовать начать" изучать, или Вы сразу лепите свой уныломайнкрафт. Коробка в моём понимании это например кубический скайбокс, но никак не структура данных для хранения огромного простанства из "вокселей". Писать прописи и поэмы - надеюсь, Вы видите разницу ?
Если у Вас уже на этом этапе такие сложности, то разумнее заняться всё же основами, причём не только 3д, а также и алгоритмами и структурами данных (к 3д[графике], кроме размерности, отношение оно имеет мало). Плюс почитать предметно, как писать и проектировать аналог майнкрафта (от нормальных разработчиков, а не школоютуберов) п.с. писал пост долго, уже появился Ваш пост |
18.06.2016, 09:15 | #9 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,883
|
Разрежённая структура это когда у Вас нет явного трехмерного массива. В таких случаях для непрерывных кубических областей используются "чанки", объекты (структуры) недробящиеся на более мелкие, но в виртуальном пространстве занимающие, например, размер 32*32*32 , сами подумайте, у Вас же будет помимо "земли" ещё и огромное пространство с "воздухом" - зачем хранить его поячеечно (пусть даже и пустым указателем в 4 байта), если можно сразу огромный кусок хранить в одном объекте (пусть даже с разными данными нужными для дальнейшего расчета дробления)? Да и саму землю тоже так хранят, но хитрее, в ней разные породы. В игре движок игры периодически эти чанки модифицирует - некоторые разбивает на ячейки (для поячеечного взаимодействия с ними), некоторые собирает. На весь мир, даже больших масштабов нет необходимости в постоянном взаимодействии(отрисовке, проверке) а, следовательно, и в хранении каждой ячейки отдельно, и вполне можно до 90% объединять в крупные блоки, занимающие гораздо меньше памяти и производительности.
Но чтобы это всё реально и грамотно написать, управлять, хранить, нужно иметь хороший опыт и много времени и внимания к разработке. Как Вы сами убедились, подходы работы в лоб (поячеечно) даёт неважные результаты, значит надо менять подход. Есть, кстати, альтернативное предложение - напишите сперва толковую двумерную версию (при желании трехмерную "в кишках", но просто с толщиной в 1 ячейку) - тогда и поймёте всю "глубину" этой затеи (и сможете экстраполировать её на 3мерную). |
18.06.2016, 09:23 | #10 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
phomm
Аналог майнкрафта - это конечно аналогия хорошая, но не совсем правильная: я пытаюсь сделать коробку, в которой смогу размещать разные пиксели, из которых буду формировать разномастные объекты. Школоютубер - тоже интересно, однако майнкрафт в ютубе я не смотрю, и в сам майнкрафт не играл уже наверное два года. Что же касается моего возраста - это отдельная тема для дискуссии. "Мои сложности" - то это лишь незнание о "разреженных структурах", и "метаблоках". В остальном - натыкаясь на "камни преткновения", я понимаю, что делаю, и знаю, что хочу сделать. P.S. Оскорблениями проблему не решить.
Подпись ? Не, не слышал ...
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Для заданной строки определить все входящие в неё символ. Например: строка "abccbbabbac" состоит из символов "a", "b" и "c" | Sandakan01 | Помощь студентам | 1 | 24.02.2016 03:20 |
игра "worms", доработка игры "косынка". C# | den790 | Фриланс | 11 | 09.12.2011 10:53 |
Напечатать текст, удалив из него все цифры и знаки "+" или "–". Язык С++. | KaylasMKTY | Помощь студентам | 8 | 07.03.2010 21:35 |
PHP(или другой язык): Получить все пары "имя" -> "значение" переданные методом POST | KingOfNothing | PHP | 4 | 12.04.2009 14:06 |
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует | skobets | Общие вопросы C/C++ | 2 | 03.06.2008 06:51 |