Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2016, 10:36   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Простейшая "игра" (или симуляция)

Всем привет. Пишу сюда ради общего развития. Интересует вопрос из области 3D игр: можно ли назвать простейшей примерно следующую конструкцию - коробка, в которой я могу перемещать камеру в четырёх (или восьми) направлениях (посредством управления теми же WASD) ?
Если честно, я даже не знаю, как это правильно называется, поэтому, собственно, и пишу сюда. С чего мне начать ?
Интересует не какой то движок типа 3D Unity (и подобные), а хочу попробовать написать что нибудь своё, как уже написал - ради общего развития.
Работать умею разве что с GDI (+), то есть - 2D, и на него проецировать трёхмерное изображение, думаю, будет весьма накладно для компьютера, и получится нечто неадекватное.
С чего мне начинать, какую литературу курить ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 16.06.2016, 15:44   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

В каком смысле назвать простейшей ? В плане запрограммировать ? зависит от средств реализации. Например, взяв дельфи, можно сразу прописать uses OpenGL и набросать простой пример из Краснова "Графика OpenGL в проектах Delphi" , там строк 30 своего кода и строк 50 красновского - получится коробка и камера с кнопками - несколько операций над матрицами будут в основе, работа с матрицами - несильно заумная теория - почитали да попробовали.
А если сильно охота, беретё учебник математики и пишете код представления 3хмерного простанства, моделей, видовых преобразований, проекций, растеризации, такое можно и в GDI сделать (не усложняя если), примерно как тут и не так уж слабы софтверные рендереры, зависит как напишете, если пишете несложное, то потянет с гарантией.
А есть и много других инструментов, как-то ДиректХ, новые спецификации всякие, вроде Vulkan , Metal, новых шейдермоделей, по ним тоже есть всякие уроки, что-то может делаться проще, что-то сложнее, просто берёте понравившееся или более распространённое. Материалов сейчас тьма, хоть под браузеры пишите 3дсцены.
Движки тоже полезно покрутить, может и понравится, но и с нуля начинать нормально, чтобы потом в движках "видеть" глубже.
phomm вне форума Ответить с цитированием
Старый 16.06.2016, 17:49   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
такое можно и в GDI сделать
Если мой пример - тогда, думаю, что можно; но если мою коробку наполнить какими нибудь объектами, формировать "на лету" картинки (те же BitMap), и выбрасывать их в какой нибудь ImageBox (по мере обновления проекции) - то можно получить FPS не больше 10, особенно, если кадр большой.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 17.06.2016, 06:36   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Так никто не говорит рендерить сложные сцены, для нескольких геометрических фигур - нормально, чтобы понять всю кухню этого будет достаточно, а Вы, на минутку, задались именно этой целью. Потом надо будет - поставите цели сложнее и возьмёте инструменты сложнее. Я это Вам сказал в том разрезе, что "начать" в 3д можно и с теми навыками, что Вы описали.
А если Вы хотите сразу получить что-то адекватное из экспериментов с любой (даже крутой) технологией - "разочарую я тебя до невозможности" © Г. Жеглов
Это как бы всё самоочевидно.
Дерзайте, изучайте, не вижу препонов.
phomm вне форума Ответить с цитированием
Старый 17.06.2016, 22:24   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

phomm
Решил "попробовать" воссоздать свою коробку (на C#), и застопорился на следующей проблеме: физическая нехватка ОЗУ на этапе создания трёхмерного массива. Что я делаю неправильно ? Судя по всему, неправильно задаю размеры, но тогда это уже будет масштабирование, или достаточно маленькая коробка ...
В моём понимании, один элемент массива равен одному пикселю "реального" пространства; но даже кубик размерами 500x500x500 пикселей будет занимать пол гигабайта, при одном элементе в 4 байта. А это, к слову, визуально маленький кубик (в моём понимании). В догонку int'а недостаточно для передачи цвета и прозрачности, а значит, либо встроенный Color (24 байта, вся структура разжиреет в 6 раз), либо свой тип, который выглядит примерно так:
Код:
public class Particle
{
	public Particle()
	{
		alpha=red=green=blue=0;
	}
	public byte alpha,red,green,blue;
}
Но даже с таким подходом я не получу достаточно большое пространство, если просто захочу этого. А в играх я видел довольно таки огромные "коробки", опять же - в моём понимании.

P.S. Альфа-канал в структуре Particle описан пока чисто для возможности развития, если таковая имеется; пока что для меня достаточно того, что бы я имел прозрачные и непрозрачные элементы в своём пространстве.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 18.06.2016, 03:43   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

там разреженная структура нужна, хранить регионами только.
+многие блоки можно хранить мета блоками.

Цитата:
В догонку int'а недостаточно для передачи цвета и прозрачности, а значит, либо встроенный Color (24 байта, вся структура разжиреет в 6 раз)
int и Color занимают 32-бита.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.06.2016, 08:34   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
там разреженная структура нужна, хранить регионами только.
Вот что у меня есть:
Код:
// ----- класс формы
public void InitializeSpace(int maxx,int maxy,int maxz)
{
	int x,y,z;	
	spacearray=new Particle[maxx][][];
	for (x=0;x<maxx;x++)
	{
		spacearray[x]=new Particle[maxy][];
		for (y=0;y<maxy;y++)
		{
			spacearray[x][y]=new Particle[maxz];
			spacearray[x][y][maxz-1]=new Particle(0,0,127,255); // задняя стенка
			//spacearray[x][y][0]=new Particle(0,0,127,255); // передняя стенка
			if (/*x==0 || */x==maxx-1)
				for (z=0;z<maxz;z++)
					spacearray[x][y][z]=new Particle(0,0,127,0); // левая/правая стенка
			else {}
			if (/*y==0 || */y==maxy-1)
				for (z=0;z<maxz;z++)
					spacearray[x][y][z]=new Particle(0,128,128,128); // потолок/пол
			else {}
		}
	}
	// комментариями выделены условия и инициализация для граней коробки, которые пока что не нужно инициализировать
}
Particle[][][] spacearray; // собсна, коробка
// ----- ...
// ----- Где то тут класс формы заканчивается

public class Particle // ну вы поняли
{
	public Particle(byte alpha,byte red,byte green,byte blue)
	{
		this.alpha=alpha;
		this.red=red;
		this.green=green;
		this.blue=blue;
	}
	public byte alpha,red,green,blue;
}
Как эту структуру нужно делать "разреженной" ? И вообще, как это "разреженная структура" ?

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
+многие блоки можно хранить мета блокам
Опять же, что это, и как ?
Я сразу заметил, что инициализировать все элементы весьма накладно; инициализируя все грани моей коробки (750x500x500) память процесса занимает 786 с лишним мегабайт. Если инициализацию элементов не выполнять, а только сделать саму коробку - будет 765 мегабайт, Так что на инициализации я много памяти сэкономлю только в том случае, если будет динамическая обработка большого количества объектов. Но всё это не имеет никакого смысла, пока мой ящик с ничем (точнее - с одними указателями) занимает 765 мегабайт.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
int и Color занимают 32-бита
Если написать следующий код:
Код:
Color test=new Color();
int size=System.Runtime.InteropServices.Marshal.SizeOf(test);
То в переменной size будет лежать 24, а используемая функция возвращает размер объекта в байтах.
Промерять размер для объекта Particle этой функцией не получиться - System.ArgumentException (Невозможно упаковать тип "Space.Particle" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл). Но можно предположить, что такой объект будет занимать не меньше 4 байт, плюс указатели, и прочая дичь; и это в любом случае меньше, чем стандартный Color, который держит в себе как три цветовых канала, так и альфа-канал. Для чего выделяется ещё 20 байт - знает только сама MSVS.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 18.06.2016 в 17:21.
OmegaBerkut вне форума Ответить с цитированием
Старый 18.06.2016, 08:55   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Вам бы определиться, Вам основы "пробовать начать" изучать, или Вы сразу лепите свой уныломайнкрафт. Коробка в моём понимании это например кубический скайбокс, но никак не структура данных для хранения огромного простанства из "вокселей". Писать прописи и поэмы - надеюсь, Вы видите разницу ?
Если у Вас уже на этом этапе такие сложности, то разумнее заняться всё же основами, причём не только 3д, а также и алгоритмами и структурами данных (к 3д[графике], кроме размерности, отношение оно имеет мало). Плюс почитать предметно, как писать и проектировать аналог майнкрафта (от нормальных разработчиков, а не школоютуберов)

п.с. писал пост долго, уже появился Ваш пост
phomm вне форума Ответить с цитированием
Старый 18.06.2016, 09:15   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Разрежённая структура это когда у Вас нет явного трехмерного массива. В таких случаях для непрерывных кубических областей используются "чанки", объекты (структуры) недробящиеся на более мелкие, но в виртуальном пространстве занимающие, например, размер 32*32*32 , сами подумайте, у Вас же будет помимо "земли" ещё и огромное пространство с "воздухом" - зачем хранить его поячеечно (пусть даже и пустым указателем в 4 байта), если можно сразу огромный кусок хранить в одном объекте (пусть даже с разными данными нужными для дальнейшего расчета дробления)? Да и саму землю тоже так хранят, но хитрее, в ней разные породы. В игре движок игры периодически эти чанки модифицирует - некоторые разбивает на ячейки (для поячеечного взаимодействия с ними), некоторые собирает. На весь мир, даже больших масштабов нет необходимости в постоянном взаимодействии(отрисовке, проверке) а, следовательно, и в хранении каждой ячейки отдельно, и вполне можно до 90% объединять в крупные блоки, занимающие гораздо меньше памяти и производительности.
Но чтобы это всё реально и грамотно написать, управлять, хранить, нужно иметь хороший опыт и много времени и внимания к разработке.

Как Вы сами убедились, подходы работы в лоб (поячеечно) даёт неважные результаты, значит надо менять подход.

Есть, кстати, альтернативное предложение - напишите сперва толковую двумерную версию (при желании трехмерную "в кишках", но просто с толщиной в 1 ячейку) - тогда и поймёте всю "глубину" этой затеи (и сможете экстраполировать её на 3мерную).
phomm вне форума Ответить с цитированием
Старый 18.06.2016, 09:23   #10
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

phomm
Аналог майнкрафта - это конечно аналогия хорошая, но не совсем правильная: я пытаюсь сделать коробку, в которой смогу размещать разные пиксели, из которых буду формировать разномастные объекты.
Школоютубер - тоже интересно, однако майнкрафт в ютубе я не смотрю, и в сам майнкрафт не играл уже наверное два года. Что же касается моего возраста - это отдельная тема для дискуссии.
"Мои сложности" - то это лишь незнание о "разреженных структурах", и "метаблоках". В остальном - натыкаясь на "камни преткновения", я понимаю, что делаю, и знаю, что хочу сделать.
P.S. Оскорблениями проблему не решить.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для заданной строки определить все входящие в неё символ. Например: строка "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