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.
Если так в майнкрафте (а судя по тормозам, это таки так) - нотч адский говнокодер. Набуя?! Тут уже говорили - дискретизируем координату, читаем соседние ячейки.. Регулярная сетка же, клинически простой случай.


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

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