Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#1: 2020-11-06 00:23:42 ЛС | профиль | цитата
Привет, жители галактики. Многие знают MCGL 9 - предмет, позволяющий с помощью скриптов выводить в проекторе всякие кубики. Некоторые даже делали в нем новогодние ёлки, но в целом эта тема далеко не заходила и оставалась уделом профи-кодеров-математиков. Сегодня я пошатну это утверждение. Представляю вам...

3D движок для mcgl9



Видео с моделькой
Видео с ковром, подсвечивающим позицию игрока


Как это работает?

В движке модели создаются очень просто - достаточно лишь представить шаблон в виде текста. Например:
.......oo.......
.....oooooo.....
....ooo..ooo....
....oo....oo....
....oo....oo....
....ooo..ooo....
....oooooooo....
....oooooooo....
....oooooooo....
..oooooooooooo..
.oooooop.oooooo.
oooooooooooooooo
ooo.oooooooo.ooo
oo..oooooooo..oo
oo..oooooooo..oo
o..............o

Затем совсем немного вспомогательного кода и модель выводится в проекторе!
let scene = new Scene();
// создаем экземпляр ракеты по шаблону
let rocket = createMeshFromTemplate(rocketModel);
rocket.position = vec3(0, 8, 0);
// добавляем ракету на сцену
scene.addElement(rocket);

mcgl9.onUpdate(time =› {
scene.update();
});

Это стало возможно благодаря моему набору разработчика для mcgl9: https://github.com/iassasin/mcgl9-script. Но чтобы пользоваться всеми этими удобствами, нужно установить себе nodejs, научиться немного работать с консолью и т.п.

Ну вот, опять все для профи-кодеров-математиков. Что делать простым энтузиастам?

Я подготовил специальную минифицированную сборку движка, вставив которую в начало своего скрипта, можно пользоваться им полноценно!


Например:

// тут код движка
...
n.addElement(u)),"p"===p&&(n.pivot=c(s,a,u&&u.position&&u.position.z||0))}return n},degToRad=s,vec3=c,vecAddVec=function(t,o){
return{x:t.x+o.x,y:t.y+o.y,z:t.z+o.z}},vecInvert=n,vecMultVal=o,vecNormalize=r}();
...
// тут ваш код!

function init() {}

var rocketModel = [
'.......oo.......',
'.....oooooo.....',
'....ooo..ooo....',
'....oo....oo....',
'....oo....oo....',
'....ooo..ooo....',
'....oooooooo....',
'....oooooooo....',
'....oooooooo....',
'..oooooooooooo..',
'.oooooop.oooooo.',
'oooooooooooooooo',
'ooo.oooooooo.ooo',
'oo..oooooooo..oo',
'oo..oooooooo..oo',
'o..............o',
].join('\n');

var scene = new Scene();
scene.position = vec3(8, 0, 8);

var rocket = createMeshFromTemplate(rocketModel);
rocket.position = vec3(0, 8, 0);
scene.addElement(rocket);

function update(time) {
var rot = (time % 3600 / 3600) * 6.28;
rocket.rotation.z = Math.sin(rot) * 30;
scene.update();
}

Документация по функционалу движка

Конечно, движок способен на большее, чем просто выводить ракету, хоть и является простым. В репозитории я подробно описал основные функции. Если вы чувствуете себе силы и решимость, вы можете прочитать документацию по ссылке и заставить ракету летать! (А еще там есть пример из видео с летучей мышью).



Полезные ниндзя-техники

Быстрая проверка скрипта

Хотите, чтобы изменения скрипта мгновенно применялись в проекторе в игре? С последним обновлением это стало возможно! Если вы смотрели видео из начала поста, то могли заметить, что у меня именно так все и происходит: меняется скрипт - изменения уже отображаются в игре. Этого можно достичь следующим образом:
1. Перейти в папку клиента: %Путь_к_клиенту%\plugins\.
2. Поместить туда скачанный выше шаблон скрипта.
3. Вписать в блокнот в игре следующий код:
sys.use('@rocket'); // то же самое имя, что у файла, например, plugins/rocket.js -› @rocket. @ в начале важна, не удалять ее.

Теперь клиент будет следить за изменениями этого файла. Подробнее можно прочитать в вики об этом феномене: MCGL 9.

НО ПОМНИТЕ! Это будет работать только для вас, т.к. у других игроков в папке с клиентом не будет лежать вашего файла со скриптом. Поэтому эта ниндзя-техника полезна для быстроты отладки вашего скрипта. А для использования в повседневной жизни и демонстрации всем гостям стоит скопировать код из файла и вставить напрямую в блокнот. Прямо так - Ctrl+C и Ctrl+V.

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

Не влезает... Слишком большой код...

Ваши модели получились слишком большими и не влезают в блокнот? Еще есть надежда! Можно воспользоваться онлайн-сервисами для минификации кода, и тогда он может влезть в проектор! Например, этот: https://javascript-minifier.com/ (окей, гугл "minify js online").

Последняя ниндзя техника

А нет, я вас обманул. Это не техника. Здесь я просто говорю спасибо всем, кто прочитал этот пост до конца. Надеюсь, он оказался для вас полезным!
P.S.: извините, если кого зацепил пафосом, я не специально :-)

Спасибо! Приятного всем моделирования!
карма: 125
20
Голосовали:Sucashi, Danya_14, 1352478, Trader, Miracle-, kriponeko, -ChappiE-, social, OTBETCTBEHHblN, Zarok, apl, DJ-MATAIL, ninzelovo, Android995, DeMoNo5060, Ghost, Moonlight_420, MpSeVEN, Embr0n, Mor9Ik
Ответов: 4114
Alliance
Old Leader
#2: 2020-11-06 00:31:25 ЛС | профиль | цитата
Обязательно попробую на выходных
карма: -55
Alliance*?
0
Ответов: 676
#3: 2020-11-06 00:32:19 ЛС | профиль | цитата
Спасибо! Займусь этим, когда захочу как-то украсить свой обс-гроб
карма: -25
Alliance вернём былую славу!
0
Ответов: 513
Revelations
second class soldier
#4: 2020-11-06 00:37:30 ЛС | профиль | цитата
Модель кнопки будет в полу для того, чтобы нагнуть всех за three hundred diamonds ♂
карма: -7
Там где ты учился, я преподавал
0
Ответов: 126
Mafia
Консильери
#5: 2020-11-06 03:48:41 ЛС | профиль | цитата
Assasin, ты ведь общаешься с разрабами, намекни чтобы вокселям rotate добавили) И произвольные полигоны. И чутка памяти на сервере по токену. И чтение-переключение ред сигналов по сторонам проектора. И чтобы отображался уже у всех по-умолчанию, один фиг в мире их почти нет.

Кстати, у тебя же свой сайт, сделай там браузерный редактор для моделек, чтобы не текстом рисовать, а как в ЧХ. Там же можно добавить простое анимирование визуальным расположением. У меня такое в планах было, но чот лень(
карма: -4
0
Ответов: 2851
Tomorrow
лидер
#6: 2020-11-06 06:46:07 ЛС | профиль | цитата
Чтоб не вставлять руками перенос строки \n, можно использовать массив, а после склеить его в строку:
var rocketModel = [
'.......oo.......',
'.....oooooo.....',
'....ooo..ooo....',
'....oo....oo....',
'....oo....oo....',
'....ooo..ooo....',
'....oooooooo....',
'....oooooooo....',
'....oooooooo....',
'..oooooooooooo..',
'.oooooop.oooooo.',
'oooooooooooooooo',
'ooo.oooooooo.ooo',
'oo..oooooooo..oo',
'oo..oooooooo..oo',
'o..............o',
''
].join('\n')

По крайнй мере я надеюсь, что join() был добавлен в те доисторические времена, на которых работает mcgl9.
карма: -52
Не пью,не курю,на ноль не делю.
1
Голосовали:Assasin
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#7: 2020-11-06 12:55:08 ЛС | профиль | цитата
DJ-MATAIL писал(а):
По крайнй мере я надеюсь, что join() был добавлен в те доисторические времена, на которых работает mcgl9.

Да, все работает. Забыл про join, спасибо! Поправил ссылки в первом посте.
kriponeko писал(а):
Assasin, ты ведь общаешься с разрабами, намекни чтобы вокселям rotate добавили)

К сожалению, все не так просто. Сейчас воксели рисуются тесселятором, который не поддерживает повороты (им же рисуется бОльшая часть блоков в игре). Чтобы добавить повороты, придется придумывать другой способ отрисовки, что может быть не быстро.
kriponeko писал(а):
И чтение-переключение ред сигналов по сторонам проектора

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

--- Добавлено в 2020-11-06 13:05:30

kriponeko писал(а):
Кстати, у тебя же свой сайт, сделай там браузерный редактор для моделек, чтобы не текстом рисовать, а как в ЧХ. Там же можно добавить простое анимирование визуальным расположением. У меня такое в планах было, но чот лень(

Вот не поверишь, мне тоже лень Движком я что-то прям загорелся, а на полноценный эмулятор mcgl9 - пока нет.
карма: 125
0
Ответов: 3910
#8: 2020-11-06 13:28:23 ЛС | профиль | цитата
Что такое тесселятор

Исходя из статьи, думаю можно тесселятором вращать блоки, меняя порядок сторон
карма: -4
0
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#9: 2020-11-06 13:35:47 ЛС | профиль | цитата
SkyDragon писал(а):
Исходя из статьи, думаю можно тесселятором вращать блоки, меняя порядок сторон

Да, но для полноценного вращения (как в реализованном мной движке или оригинальном OpenGL) придется просчитывать все координаты вручную, что не очень эффективно. По сути и в моем движке как раз идет просчет всех этих координат вручную, но имея только воксели, иначе сделать и не получится. В реализации mcgl9 можно иначе, и нужно.
карма: 125
0
Ответов: 126
Mafia
Консильери
#10: 2020-11-06 13:43:58 ЛС | профиль | цитата
Assasin писал(а):
Это уже код должен начать выполняться на сервере, что дает нехилую возможность положить сервер своим скриптом. Для реализации такой фичи придется очень затратиться на реализацию безопасности. Сейчас если проектор залагал, то ты перезапустил клиент. А если залагает сервер - плохо будет всем.
Да нет же, не обязательно на сервере, рычаг ведь переключается с подачи клиента, тут та же история.
карма: -4
0
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#11: 2020-11-06 14:05:13 ЛС | профиль | цитата
kriponeko писал(а):
Да нет же, не обязательно на сервере, рычаг ведь переключается с подачи клиента, тут та же история.

В этом случае любой, кто придет на твою терру, сможет переключать ред сигнал. Кроме того, если соберется много народу (как на спавне), то каждый пошлет скриптом сигнал, что будет зачем-то излишне нагружать сервер. В общем, все не так просто, поэтому нужно делать на сервере, где это еще сложнее.
карма: 125
0
Ответов: 126
Mafia
Консильери
#12: 2020-11-06 14:35:29 ЛС | профиль | цитата
Assasin писал(а):
В этом случае любой, кто придет на твою терру, сможет переключать ред сигнал. Кроме того, если соберется много народу (как на спавне), то каждый пошлет скриптом сигнал, что будет зачем-то излишне нагружать сервер. В общем, все не так просто, поэтому нужно делать на сервере, где это еще сложнее.
● В скрипте можно использовать user.name() для ограничения способных к взаимодействию.
● Сигналы смены состояния на уже используемое можно игнорировать.
● Тактовый генератор на редстоуне работает, и на нагрузку от него никто не жалуется.
● Частоту применения функции переключения легко ограничить.
● Не сложно, если не усложнять)

Кстати, сколько существует итемов MCGL9, и сколько используются? Есть мнение, что почти никому кроме нас это и не надобно особо(
карма: -4
0
Ответов: 1726
#13: 2020-11-06 14:49:16 ЛС | профиль | цитата
Да нам и с мод клиентом от скайвокера норм играется
карма: -41
Мой Ютуб канал "Ниок о тебе ходят легенды" @ Shelby
0
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#14: 2020-11-06 19:44:14 ЛС | профиль | цитата
kriponeko писал(а):
Тактовый генератор на редстоуне работает, и на нагрузку от него никто не жалуется.

Тактовый генератор всегда работает на стороне сервера, и гарантировано не запускается чаще 20 тиков в секунду, с клиентов может прилететь больше событий.
Но в целом звучит правдоподобно, конечно. Кроме одного момента - не понятно, что делать, когда одновременно прилетает 2 и более противоречивых события с двух клиентов.
карма: 125
0
Ответов: 3910
#15: 2020-11-06 20:11:34 ЛС | профиль | цитата
Assasin, чья зона тот и в приоритете) Это более, чем логично) так же для отправки сигналов сделать ограничение, что могут отправлять сигнал только прописанные в территории и отправлять на сервер так, чтобы до клиента ответ доходил только, если он находится в радиусе N чанков от источника, дабы клиент не грузил на себя все источники с карты

Assasin писал(а):
Да, но для полноценного вращения (как в реализованном мной движке или оригинальном OpenGL) придется просчитывать все координаты вручную, что не очень эффективно. По сути и в моем движке как раз идет просчет всех этих координат вручную, но имея только воксели, иначе сделать и не получится. В реализации mcgl9 можно иначе, и нужно.

надо продумать как просчитать матрицу вершин для поворота, я в школе делал такую матрицу для любого угла поворота, там две матрицы составляются и перемножаются, я думаю это можно сделать, осталость вспомнить как)
карма: -4
0
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#16: 2020-11-06 22:55:51 ЛС | профиль | цитата
SkyDragon писал(а):
надо продумать как просчитать матрицу вершин для поворота, я в школе делал такую матрицу для любого угла поворота, там две матрицы составляются и перемножаются, я думаю это можно сделать, осталость вспомнить как)

Про эти матрицы я и говорил, когда писал "придется просчитывать вручную".
карма: 125
0
Ответов: 101
#17: 2020-11-06 23:03:12 ЛС | профиль | цитата
SkyDragon писал(а):
надо продумать как просчитать матрицу вершин для поворота

Могу стать кэпом, но раньше я использовал Аффинное преобразование
карма: -2
0
Ответов: 3910
#18: 2020-11-06 23:09:11 ЛС | профиль | цитата
EZhandrs, возможно, но там не такое преобразование было.

Assasin, ну если алгоритм какой-то разработать. Там суть была в том, что мы задаем изначальные координаты фигуры и градус поворота, дальше она сама считает, как строить проекцию. По идее, если взять цикл от 0 до 179, то он просчитает поворот на каждый градус.
карма: -4
0
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#19: 2020-11-06 23:39:17 ЛС | профиль | цитата
SkyDragon писал(а):
EZhandrs, возможно, но там не такое преобразование было.

Матрицы трансформации используются для афинных преобразований как раз, так что вы об одном и том же.
Я в своем движке их как раз и реализовал: https://github.com/iassasin/mcgl9-script/blob/master/mcgl9/3d/TransformMatrix.ts#L91
SkyDragon писал(а):
Assasin, ну если алгоритм какой-то разработать. Там суть была в том, что мы задаем изначальные координаты фигуры и градус поворота, дальше она сама считает, как строить проекцию. По идее, если взять цикл от 0 до 179, то он просчитает поворот на каждый градус.

Ты все еще говоришь о ручных рассчетах. А их должнен считать OpenGL, я об этом.
карма: 125
0
Ответов: 3910
#20: 2020-11-07 00:14:28 ЛС | профиль | цитата
Assasin, а, теперь понял о чем ты) Сами афинные преобразования OGL делает http://media.ls.urfu.ru/435/1147/2450/
карма: -4
0
Ответов: 126
Mafia
Консильери
#21: 2020-11-07 04:21:10 ЛС | профиль | цитата
Assasin писал(а):
не понятно, что делать, когда одновременно прилетает 2 и более противоречивых события с двух клиентов.
Если возможность смены состояния уже откатилась, то первое применяется, а второе отлетает по причине ухода функции в кд. Ничего непонятного.
карма: -4
0
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#22: 2020-11-07 21:36:04 ЛС | профиль | цитата
Обновил движок (и ссылку на шаблон в первом посте). Теперь можно управлять маской цвета вокселей.

(Для вставки в блокнот) Ссылка на минифицированный скрипт ковра

Ссылка на исходник ковра

Ковер, подсвечивающий позицию игрока

P.S.: оказывается, у проектора есть ориентация. Так что код с ковром будет работать только при корректно поставленном проекторе.
карма: 125
3
Голосовали:_Karnelius_, OTBETCTBEHHblN, DJ-MATAIL
#23: Этот пост был удален
Ответов: 2851
Tomorrow
лидер
#24: 2020-11-08 06:26:28 ЛС | профиль | цитата
Assasin писал(а):
ковер
Да ну какой же это ковер ?)
Трушные ковры выглядят как-то так

карма: -52
Не пью,не курю,на ноль не делю.
0
24
Сообщение
...