forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   minecraft (http://forum.boolean.name/showthread.php?t=14851)

den 07.06.2011 17:07

minecraft
 
1) я не пытаюсь сделать майнкрафт с элементами крайзиса
2) я вообще не пытаюсь сделать клон майнкрафта
3) я вобще не пытаюсь ничего сделать

просто интересно.

Итак. Собственно вопросы о некоторых приёмах в майнкрафте. Хотя эти приёмы есть во всех играх... но я раньше както не интересовался ими.
Вобщем вопросы:
1) Как происходит столкновения игрока с кубами? Перебираются все кубы в чанке* на котором находится игрок, и проверяется пересечение между игроком и каждым кубом?
2) Как выбирается куб (и его грань), над котором указатель мыши? Опять же, перебираюся все кубы и т.д ?


Размеры одного чанка* — 16 блоков шириной, 16 блоков длиной и 128 блоков глубиной [пруфлинк]. Тоесть 32768 кубов. И перебирать все эти кубы каждый(?) кадр помойму слишком долго.

*чанк - "кусочек" карты.

RegIon 07.06.2011 17:11

Ответ: minecraft
 
наверно перебираются только кубы которые рядом,например 20*20*20,а сортированы они по пачкам тежи 20*20*20...
Цитата:

2) Как выбирается куб (и его грань), над котором указатель мыши? Опять же, перебираюся все кубы и т.д ?
пикают наверно,а потом по id находят в масиве где-нить

den 07.06.2011 17:16

Ответ: minecraft
 
Цитата:

пикают наверно,а потом по id находят в масиве где-нить
да ты красавчег.
я и спрашиваю, полным перебором?


Все вопросы в силе.

pax 07.06.2011 18:56

Ответ: minecraft
 
1. Например физика, хотя в майнкрафте наверняка своя. Я вот тут ставил кубики для коллизий рядом с игроком (3х3 клетки, т.е. максимум 9 кубиков), по ним и прыгал.

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

den 07.06.2011 19:23

Ответ: minecraft
 
Хм, захотелось аж попробывать!:)
А если подключик к клону майнкрафта Bullet Physics не слишком жирно будет не будет зависаний?

ffinder 07.06.2011 19:38

Ответ: minecraft
 
Цитата:

Сообщение от Den (Сообщение 190594)
1) Как происходит столкновения игрока с кубами? Перебираются все кубы в чанке* на котором находится игрок, и проверяется пересечение между игроком и каждым кубом?
2) Как выбирается куб (и его грань), над котором указатель мыши? Опять же, перебираюся все кубы и т.д ?

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

как пикать грани? думаю стоит погуглить алгоритм raycasting из wolfenstein3d.

moka 07.06.2011 19:44

Ответ: minecraft
 
Дык, есть чанк - он держит 3д массив с ссылками на каждый куб (хотя бы, наличие/отсутствие).
Далее, позиция объекта, по ней можно выбрать радиус ближайших элементов из массива чанка. Не нужно перебирать всё, идите с другой стороны, у вас уже есть инфа, какие нада перебирать, лишь те что рядом. Главное иметь к ним доступ из массива, где каждый индекс, имеет связь с координатами в мире, и есть возможность получать по координатам индекс и наоборот.

den 07.06.2011 19:52

Ответ: minecraft
 
Всё, тему можно закрывать. Спасибо ffinder'у!

Mr_F_ 07.06.2011 21:58

Ответ: minecraft
 
Цитата:

1) Как происходит столкновения игрока с кубами? Перебираются все кубы в чанке* на котором находится игрок, и проверяется пересечение между игроком и каждым кубом?
2) Как выбирается куб (и его грань), над котором указатель мыши? Опять же, перебираюся все кубы и т.д ?
да это же идеальный случай для octree.
коллизию считать вообще проще простого учитывая что всё состоит из неротированных кубов.

ABTOMAT 08.06.2011 00:31

Ответ: minecraft
 
Уже Эф написал, что я хотел написать.
Почитай исходники моего недокрафта что ли, там как раз коллизия сделана (в более простом случае - в массиве)

ffinder 08.06.2011 00:37

Ответ: minecraft
 
октри для коллизии тут как собаке пятая нога, ящитаю.

pax 08.06.2011 01:22

Ответ: minecraft
 
Хороший реф http://lodev.org/cgtutor/
Конкретно по теме: http://lodev.org/cgtutor/raycasting.html

JACUK 12.06.2011 19:36

Ответ: minecraft
 
Народ у кого было сто комп вырубался при игре? Как полечить?

YellowAfterlife 13.06.2011 01:06

Ответ: minecraft
 
С того что упоминал Notch в твиттере и youtube, вся "система столкновений" Minecraft'а - банальный AABB (axis aligned bounding box).
То есть столкновения игрока с 3д массивом реализуются как три цикла for, проверяющие на наличие твердого блока в клетке. Диапазон задается как (x - sizeX) div blockSize .. (x + sizeX) div blockSize.

Поскольку мир весьма и весьма кубический, raycast можно так же упростить, делая проверку подобно рисованию линии в графических редакторах - смещение "указателя" делается постоянно, но проверки блока осуществляются лишь когда изменилась целая часть одной из составляющих.
К примеру, для угла ~44 градуса в двухмерном пространстве проверки будут делатся так:
Код:

____X
___XX
__XX_
_XX__
OX___

где "О" - точка в которой находится камера, X - проверяемая клетка карты.

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

JACUK: скорее всего просто заканчивается память изза постоянных утечек (см. порой нелинейные руки разработчика). Если играть в браузере, то в таком случае будет просто крах браузера (или контейнера плагинов) вместо всего компьютера.

Надеюсь, это помогает.

Taugeshtu 13.06.2011 01:54

Ответ: minecraft
 
Цитата:

То есть столкновения игрока с 3д массивом реализуются как три цикла for, проверяющие на наличие твердого блока в клетке. Диапазон задается как (x - sizeX) div blockSize .. (x + sizeX) div blockSize.
Если так в майнкрафте (а судя по тормозам, это таки так) - нотч адский говнокодер. Набуя?! Тут уже говорили - дискретизируем координату, читаем соседние ячейки.. Регулярная сетка же, клинически простой случай.

JACUK 13.06.2011 01:54

Ответ: minecraft
 
В браузере?..а можно поподробней:)

den 13.06.2011 11:56

Ответ: minecraft
 
Цитата:

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

Igor 13.06.2011 11:59

Ответ: minecraft
 
По-моему да, причем это можно увидеть пока игра загружается))

YellowAfterlife 13.06.2011 12:47

Ответ: minecraft
 
Цитата:

Сообщение от Taugeshtu (Сообщение 191348)
Если так в майнкрафте (а судя по тормозам, это таки так) - нотч адский говнокодер. Набуя?! Тут уже говорили - дискретизируем координату, читаем соседние ячейки.. Регулярная сетка же, клинически простой случай.

Стоит заметить что при использовании упомянутого мной метода, учитывая то что размер игрока - ~0.8x0.8x1.6 блоков, то максимальное количество проверяемых за раз блоков будет равно 2х2х3 = 12.
Я не смотрел, как реализованы столкновения в MC, но логично предположить что используются циклы, поскольку далеко не все объекты имеют одинаковый физический размер. То есть, чтобы реализовать столкновения для пауков (у которых bounding box размерами в 1.*х1.*х0.*), придется переписывать функцию заново.

Цитата:

Сообщение от Den (Сообщение 191370)
Хм, а если камера находится на поверности, а под землёй есть пещера. В пещере будут отрисовыватся кубы?

Как факт, да. Так же если отредактировать terrain.png, сделав части базовых текстур полу-прозрачными (просто удалением каждого n-ого пикселя), то вы сможете созерцать весь подземный мир, стоя на поверхности.
Не думаю что можно определить надобность прорисовки нижних секторов карты, не делая массу raytrace'ов. А расходы на проведение оных скорее всего займут времени больше чем прорисовка тех немногочисленных сторон кубов в пещерах.

По последним версиям это сложно проверить, но в Classic версии игра не рисовала все блоки которые "явно" находились у игрока за спиной. Это достаточно очевидный способ оптимизации, но для однотипного мира уменьшает затраты ресурсов в ~2 раза.

Цитата:

Сообщение от JACUK (Сообщение 191349)
В браузере?..а можно поподробней:)

Если вы владеете лицензионной версией игры, то вы можете играть в нее в браузере, авторизовавшись на minecraft.net (сверху - 'Login', после - 'play (in browser)').

RegIon 13.06.2011 13:02

Ответ: minecraft
 
Цитата:

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

Taugeshtu 13.06.2011 14:12

Ответ: minecraft
 
Цитата:

Не думаю что можно определить надобность прорисовки нижних секторов карты, не делая массу raytrace'ов.
Эммм, Occlusion Culling? Хотя в принципе согласен, что проверка видимости может отъесть больше, чем отрисовка.
Вот чего я до сих пор понять не могу - почему каждый кадр меняется 1 чанк (настройка производительности - Max FPS), даже если не восход/закат (когда меняется освещение) и ничего не поменялось в структуре карты... Т.е. при 25 ФПС за секунду будет обновлено 25 чанков, не зависимо от окружающей действительности и реальной необходимости. Говнокод...

pax 13.06.2011 15:26

Ответ: minecraft
 
Вероятно есть какие-то "текучие" чанки?

ffinder 13.06.2011 15:34

Ответ: minecraft
 
чанки вообще крайне неудачная идея, ящитаю.
это все можно было бы и красивее и главное эффективнее реализовать.

pax 13.06.2011 15:35

Ответ: minecraft
 
Цитата:

Сообщение от ffinder (Сообщение 191400)
чанки вообще крайне неудачная идея, ящитаю.
это все можно было бы и красивее и главное эффективнее реализовать.

Примеры?

Mr_F_ 13.06.2011 16:23

Ответ: minecraft
 
Цитата:

Occlusion Culling
там он есть гпушный при включённом "Advanced OpenGL"

Igor 13.06.2011 22:29

Ответ: minecraft
 
Цитата:

почему каждый кадр меняется 1 чанк (настройка производительности - Max FPS), даже если не восход/закат (когда меняется освещение) и ничего не поменялось в структуре карты...
Вот представь - оптимизовали минекрафт, ты поставил высокие настройки, играешь, радуешься - а тут оп и начинается закат, от которого комп тормозит...
Вам не кажется что утечка памяти только на 64 битных системах? Играл по нескольку часов на нетбуке, никаких проблем с памятью не было.

den 13.06.2011 22:37

Ответ: minecraft
 
У меня 32 битная ось.
Через пару часов начинает юзатся своп.
Вывод?

ffinder 13.06.2011 23:11

Ответ: minecraft
 
Цитата:

Сообщение от Igor (Сообщение 191427)
Вот представь - оптимизовали минекрафт, ты поставил высокие настройки, играешь, радуешься - а тут оп и начинается закат, от которого комп тормозит...

вот, что значит оптимизировали...

Igor 13.06.2011 23:14

Ответ: minecraft
 
Вложений: 1
стал разбираться с памятью и получилась какая-то фигня
1) используется 1272 Мб, ожидание 637 Мб. Все процессы в сумме намного меньше занимают. Кто-нибудь может объяснить, куда делась память?
Win 7 home premium 32
2) В кемуляторе тоже что ли утечки памяти? зачем ему 298 мегабайт?!
Написал программульку чтобы она решала судоку на телефоне, ради интереса пустил на компе чтобы поссчитал количество вариантов расстановки, первые 4 строчки и две цифры во втором '123456789'+'456789123'+'789123456'+'912345678'+'7 8' фиксированны. (Потом оптимизирую и сравню насколько быстрее будет) Зачем столько памяти джаве?! у меня два двухмерных массива 9*9 интегер, два одномерных [0..82] of integer и несколько переменных, решение сделано итерациями в блоке repeat ... until

Lestar 13.06.2011 23:33

Ответ: minecraft
 
Цитата:

Сообщение от ffinder (Сообщение 191400)
чанки вообще крайне неудачная идея, ящитаю.
это все можно было бы и красивее и главное эффективнее реализовать.

Хотелось бы все же поднять тему и поговорить о возможных вариантах реализации.

SBJoker 13.06.2011 23:41

Ответ: minecraft
 
Бить меш на куски всё же необходимо иначе нарываемся на ограничение вершинного буфера. Кроме того единый меш нужно постоянно достраивать что несколько не быстро по сравнению с дискретным достраиванием мира.
Хотя соглашусь что в майнкрафте тот ещё говнокод. Особенно убог сервер. Это надо было додуматься пересылать целые чанки! Изменилась одна клеточка а мы весь чанк шлём! Из-за этого игра требует от сервера высокой пропускной способности ибо трафик генерится не хриновый.

pax 14.06.2011 00:12

Ответ: minecraft
 
Чанки удобны для хранения/загрузки данных на диск/с диска. Зная координаты чанка и его размер можно легко сделать фоновую подгрзку/выгрузку мира.

Igor 14.06.2011 00:29

Ответ: minecraft
 
Можно рисовать чанками и не придётся ничего сортировать.
можно проверять видимость/невидимость для всего чанка, и в противном случае не рисовать. (угол обзора меньше 90, т.е. рисовать в 4 раза меньше как минимум и не надо проверять для каждого кубика)
правда, меня очень удивляет их высота - интуитивно хочется чтобы было 16*16*16, с высотой в 128 приходится ещё рисовать подземелья((

ffinder 14.06.2011 15:20

Ответ: minecraft
 
все ваши аргументы "ЗА" исходят из предположения, что мир статичен. а он на самом деле меняется: вода и лава текут, деревья растут, освещение меняется. а еще погода, а если еще и времена года сделать - тает снег целыми равнинами, вырастают поля цветов...

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

Taugeshtu 14.06.2011 18:06

Ответ: minecraft
 
Цитата:

все ваши аргументы "ЗА" исходят из предположения, что мир статичен. а он на самом деле меняется: вода и лава текут, деревья растут, освещение меняется. а еще погода, а если еще и времена года сделать - тает снег целыми равнинами, вырастают поля цветов...

и еще вот о чем подумайте: вы мешаете в кучу модель данных и их представление, а ведь их группировка никак между собой не связана.
И снова ни слова о той самой загадочной "улучшенной" модели данных, которая была анонсирована... И как он так умеет?!
Опять же - в формате чанков весьма и весьма умещаются динамические изменения. Конечно, если уйти от "кубичности" в сторону распределения плотности пород/газов/жидкостей, приправить всё это "шумовыми" генерациями и выразить через Marching cubes - будет в 100500 раз красивее, но опять же - у чанков есть весомый плюс, и имя ему - работа с диском. Стримминг, генерация и сохранение только по необходимости - плюшечки вкусные. Есть что предложить взамен/в дополнение?

Далее. Грубо говоря, чанк 16х16х16 - это уже сам по себе объём для Occlusion Culling-а - "привязываем" динамику (мобов, например) к чанкам, или к 1/8 чанка - получаем профиты.

Satan'scry 28.06.2011 11:05

Ответ: minecraft
 
Майн лагает на слабых компьютерах, плюс написан на Java

Hurrit 28.06.2011 13:30

Ответ: minecraft
 
K.O. strikes again!

Лit}{Ъ 09.07.2011 21:38

Ответ: minecraft
 
Цитата:

Сообщение от Taugeshtu (Сообщение 191506)
Грубо говоря, чанк 16х16х16 - это уже сам по себе объём для Occlusion Culling-а - "привязываем" динамику (мобов, например) к чанкам, или к 1/8 чанка - получаем профиты.

Можно пожалуйста этот абзац изложить чуть более человеческим (или хотябы научным (тогда хоть термины по гуглить можно(люблю я скобки :) ))) языком. Инетересно стало...

Цитата:

Сообщение от Lestar (Сообщение 191433)
Хотелось бы все же поднять тему и поговорить о возможных вариантах реализации.

Поддерживаю. Тема интересна и познавательна

Taugeshtu 09.07.2011 23:17

Ответ: minecraft
 
Цитата:

Грубо говоря, чанк 16х16х16 - это уже сам по себе объём для Occlusion Culling-а - "привязываем" динамику (мобов, например) к чанкам, или к 1/8 чанка - получаем профиты.
Перевод:

Цитата:

Грубо говоря, кусок уровня в 16х16х16 кубиков - это уже сам по себе объём для оптимизации производительности через отрезание отрисовки загороженной геометрии. При связывании динамической геометрии с объёмами, в которые она попадает, можно получить распространение этого приёма ещё и на динамическую геометрию (Подвижные объекты будут "вырезаться" из отрисовки геометрией уровня). Можно соотносить динамику не с целым объёмом 16х16х16, а с 1/8 его - с блоком 8х8х8 кубиков.

Lestar 10.07.2011 06:33

Ответ: minecraft
 
К слову о алгоритмах генерации ресурсов.Попробовал с разной солью генерировать разные миры.Частота,количество однотипных ресурсов,встречающихся единовременно отличаются.Глубина залегания осталась примерно та же.Так же меняется конфигурация пещер(Были миры,в который практически все пещеры не более -8-ти блоков в высоту.Ну и по мелочи бросались некоторые вещи в глаза).
Все это ИМХО.

Taugeshtu 13.07.2011 00:43

Ответ: minecraft
 
Цитата:

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

P.S.
Попробуй зерно "Solar system". Меня покорило количество и размеры пещер, а также разнообразие ландшафтов вокруг зоны спавна.

ffinder!
Нам, я так полагаю, не ждать загадошную альтернативу чанкам за твоим авторством?

ffinder 13.07.2011 16:50

Ответ: minecraft
 
ололо! а их кто-то еще и ждал???

Randomize 13.07.2011 16:58

Ответ: minecraft
 
Выкладывай, а мы послухаем

ffinder 13.07.2011 18:15

Ответ: minecraft
 
не, пацаны.
голословно не хочется. а технодему делать довольно муторно.
так что считайте, что я слил. ну или зажал идеи. кому как лучше - тот пусть так и считает.

NitE 13.07.2011 18:51

Ответ: minecraft
 
Чё за детские отговорки и оправдания ? Мужик сказал мужик сделал!

den 13.07.2011 18:56

Ответ: minecraft
 
Мужик сказал.
Мужик забыл.
Мужику напомнили.
Мужик слил :\

Lestar 14.07.2011 12:34

Ответ: minecraft
 
Вложений: 1
Цитата:

Сообщение от Taugeshtu (Сообщение 195265)
Попробуй зерно "Solar system". Меня покорило количество и размеры пещер, а также разнообразие ландшафтов вокруг зоны спавна.

Попробовал.Glacier интереснее.

P.S.В версии 1.7.3 заметил особенность.Не работает print screen.

impersonalis 14.07.2011 13:50

Ответ: minecraft
 
Цитата:

Сообщение от Lestar (Сообщение 195441)
Не работает print screen.

нативная защита от баг-репортов

den 14.07.2011 13:54

Ответ: minecraft
 
F2 же

Lestar 14.07.2011 14:56

Ответ: minecraft
 
Цитата:

Сообщение от Den (Сообщение 195448)
F2 же

Именно print screen на клавиатуре.В версии 1.6.(какая то там) работал.

Лit}{Ъ 14.07.2011 15:46

Ответ: minecraft
 
To FFinder
Давай хотябы голословно. Оченьнама интересна суть задумки! :)
Ну пожалуйста!

Цитата:

Сообщение от Lestar (Сообщение 195441)
Попробовал.Glacier интереснее.

У меня складывается впечатление что все играют с этим зерном! :)

Lestar 14.07.2011 18:44

Ответ: minecraft
 
Кстати ,то ,что на генерацию влияет только зерно,расстроило.Я изначально предполагал что присутствует рандом.

Цитата:

Сообщение от Den (Сообщение 195448)
F2 же

Попробовал,подвесил приложение вместе с машиной.

SBJoker 14.07.2011 18:48

Ответ: minecraft
 
Блин Это и есть рандом. А "Зерно", это тупо начальное значение генератора случайных чисел.

h1dd3n 14.07.2011 19:05

Ответ: minecraft
 
Вроде как если ничего не вводить майнкрафт возьмет за "зерно" текущее время в миллисекундах (ну или время с запуска системы, неважно). Это если хочется большего рандома.

Lestar 15.07.2011 00:04

Ответ: minecraft
 
Если бы с зерном был рандом,не создавало бы идентичных террайнов.

Randomize 15.07.2011 00:07

Ответ: minecraft
 
Марш читать про генерацию ландшафтов в МК и хватит тупых догадок.
Рандом там есть.

h1dd3n 15.07.2011 00:23

Ответ: minecraft
 
Да тут скорее надо читать про генерацию случайных чисел на ЭВМ.
Lestar
Компьютер не может просто вот так вот сгенерировать тебе случайное число (числа, террайны и т.д.). Он генерирует только псевдо-случайные числа. То есть если ты за зерно возьмешь число 3 то последовательность "случайных" чисел будет всегда одинакова. Чтобы добавить побольше рандома можно взять за зерно текущее время в миллисекундах (можно конечно придраться что все неслучайно и блаблаблабла, но как то пофиг).

Chibiko 03.08.2011 12:11

Ответ: minecraft
 
Насчет генерации ландшафтов: http://notch.tumblr.com/page/4 в самом низу страницы. С английским дружу посредственно посему не осилил.

impersonalis 04.08.2011 15:15

Ответ: minecraft
 
http://habrahabr.ru/blogs/gdev/125621/

SBJoker 04.08.2011 15:27

Ответ: minecraft
 
Весьма ламерская статья. Примерно на уровне создания генератора BMP-файлов.

impersonalis 04.08.2011 15:43

Ответ: minecraft
 
Цитата:

Сообщение от SBJoker (Сообщение 197984)
Весьма ламерская статья. Примерно на уровне создания генератора BMP-файлов.

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 50 сообщение(ий)):
У вас нет прав, чтобы видеть скрытый текст, содержащийся здесь.

impersonalis 13.09.2011 23:50

Ответ: minecraft
 
http://habrahabr.ru/blogs/gdev/128368/

den 14.09.2011 16:56

Ответ: minecraft
 
http://habrahabr.ru/blogs/algorithm/111538/
вот тут круче

impersonalis 14.09.2011 17:12

Ответ: minecraft
 
Цитата:

Сообщение от Den (Сообщение 202312)

ну ссылки, приведённые в том треде - не стал копировать


Часовой пояс GMT +4, время: 10:03.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot