Melkov's
168 subscribers
582 photos
76 videos
39 files
221 links
Мой движок: @vecxylog
Чат: @melkovteam
Download Telegram
👍4
😁4
Как у вас с новогодним настроением?
«Вот я так сейчас депрессую, но на самом деле это в любом случае лучше, чем разработка на заказ. Хотя заявки постоянно приходят, но все свелось чаще всего к «сделайте, пожалуйста, нам клон „Хомяка“» (Hamster Kombat — криптовалютная игра-кликер в «Телеграме» — прим. ред.). Разработчики «Хомяка» заработали намного больше, чем те, кто его тапал, поэтому очень много кто хочет повторить успех, но мы за такое не беремся. Я уже как-то шутил в соцсетях, что хомяки в детстве существуют, чтобы познакомить детей с концепцией смертности и научить ценить свое время. Вот «Хомяк» сделал то же самое для взрослых. Ты потратил лето, а зачем? Ради 10 долларов?»

© Ян Шевченко

Источник: «Мы закрыли направление больших 3D-игр. Этим заниматься бесполезно»
🔥1
😁5
Да-да?
😁4👍1🔥1
Однажды Паскаль написал своему другу длинное, пространное письмо, а в постскриптуме извинился за то, что у него не хватило времени написать короткое.
😁2
Интересный композиционный подход.

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

Однако добавив человеческий образ, он автоматически забирает все наше внимание.

Какой бы сложной не была картинка, мы вычленяем знакомые элементы.

Наличие человекоподобных образов в кадре, автоматически сближает нас с этим кадром.

Добавив 5-10 человек хаотично - наше внимание получит рассеянный фокус, относительно общего кадра, но в то же время продолжит периодично концентрироваться на образах людей.
Да чё тут трудного, профессор? Вот так птицу оттягиваешь и запускаешь в свинью.
😁3
[Черновик небольшого кусочка первой главы]

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

Капитан резко бросил окурок за борт и рявкнул:

— Сука, ложись!

Его голос пронзил меня, как электрический разряд. Я дёрнулся к каюте, где была Соня, но зацепился ногой за канат, потерял равновесие и кубарем покатился вниз по палубе. Тут же над головой пронеслась тень — массивная, стремительная, смертоносная. Запах жжёного пороха резанул по ноздрям.

Вдалеке снова раздался взрыв, на этот раз с пронзительным свистом.

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

— Фонарь! — прокричал Капитан в мою сторону.

Я, охваченный растерянностью, переспросил:

— Ф-Фонарь?

— Выбрось нахрен! — отрезал Капитан, его слова звучали как удар по голове. — Мы тут, как мишень…

Трясущимися руками я пытался сообразить, что делать. Луч фонаря рассекал туман, как лезвие ножа, превращая нас в лёгкую добычу. Сердце гулко билось в груди. Я рванул к фонарю, но в тот же миг что-то с силой ударило в корпус корабля. Палуба вздрогнула. Меня швырнуло вбок, больно впечатав в борт. В ушах зазвенело.

Сквозь грохот и свист прорвался крик Сони.

Я зажмурился, сглотнул боль и, собравшись с силами, пополз к фонарю. Дрожащими пальцами сорвал его с крепления и швырнул за борт. Свет погас в густой тьме. Почти сразу же раздался очередной выстрел — но на этот раз мимо.

Тишина.

Мир застыл, но теперь слышны были только волны, мерно ударяющиеся о корпус судна. Сквозь плотный туман пробивался слабый лунный свет, создавая призрачное сияние. Вокруг — кромешная тьма.

Я не стал медлить. Ползком направился к каюте. Надо найти Соню.

Добравшись до тяжёлой деревянной двери, потянулся к металлической ручке. Пальцы скользили по холодному металлу. Медленно повернул её, и дверь со скрипом начала поддаваться. Сердце сжалось. Я стиснул зубы, надеясь, что этот мерзкий звук не выдаст нас.

Вдохнув глубже, толкнул дверь всем телом. Она открылась.

Каюта встретила меня пустотой.

— Соня? — тревожно позвал я, почти шёпотом.

Ответа не последовало.

Но вдруг... В полумраке я заметил что-то под кроватью. Присмотрелся. Волосы. Торчащие пряди рыжих волос.

— Соня! — крик вырвался сам собой, разрезая гнетущую тишину.
🔥1
Раньше когда игры устанавливал с дисков, на старенький и слабый комп - постоянно сидел ждал загрузку.

Этот способ был единственный и рабочий, чтобы убедиться, что комп не завис.

Особенно это важно при установке игры из нескольких дисков)

P.S. Xenus: Точка кипения был из четырех дисков

P.P.S. Через фотографию передается запах пластика и звук, когда нажимаешь на центр, чтобы поднять диск
😁4
Пришло письмо на почту спустя 4 года😆

Дмитрий Мелков - староста учебной группы. Дмитрий - человек разносторонних способностей. Он принимает активное участие как в общественной жизни техникума, так и в научной - с первого курса участвует в областных олимпиадах по физике и электротехнике (призовые и первые места). Дмитрий активно участвует в спортивных мероприятиях.

«Правительственная стипендия — это показатель высокого качества подготовки выпускников на территории региона. В этом году обладателями таких стипендий стали студенты-очники, которые учатся на «отлично» и «хорошо», и являются победителями всероссийских и международных олимпиад», — сообщил начальник департамента профессионального образования Томской области Юрий Калинюк.

Все стипендиаты за все время учебы показали высокий уровень обучаемости и посещаемости занятий.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😁2
Если здесь есть активные пользователи чат-GPT, то наверное вы уже сталкивались с проблемой удаления чатов.

У меня лично это появлялось периодически. Из-за постоянной смены контекста - накопилось много мусорных чатов, которые очень хочется очистить. Их много и на сайте нет функции удаления одной кнопкой сразу все.

Поэтому они заставляют тебя удалять по одному чату.

Сейчас на коленке написал скрипт, который в одно выполнение удаляет сразу все чаты.

Ссылка на скрипт: https://gist.github.com/Melkov-source/9cc9e501187e8b160363dfacd8c1d497

Как юзать:
1. Нажимаешь F12 и открываешь вкладку networks
2. Удали какой-то один чат и там у тебя появится апи. В нем скопируй свой authorization bearer токен
3. В скрипте вставь его в переменную
4. Скопируй скрипт и выполни его в console

P.S. Может есть другой способ, но очевидной кнопки "Удалить все чаты" - я не обнаружил. Хотя может я слепой и там где-то есть метровая красная кнопка, но пока мое сознание не может его заметить.
👍2
😁5
1😢6😁2👍1🔥1
Простой формат растровых изображений.

Достаточно открыть блокнот и в нем указать разрешение в пикселях. Выставить яркость и массив цветов в формате RGB.

Интересный курс для начинающих по компьютерной графике. Он на основе книги Fundamentals of CG (4 издание).

Удобно тем, что просмотрел курс на легке, попрактиковался немного, а потом добить можно прочитав более детально и подробно книгу (в ней гораздо больше инфы, чем изложено в курсе)

Ссылка: https://www.youtube.com/playlist?list=PLplnkTzzqsZTfYh4UbhLGpI5kGd5oW_Hh
Изучаю компьютерную графику и с полного нуля разрабатываю 2D-движок для веб-игр на TypeScript.

В канале веду дев-логи: копаюсь в графоне, экспериментирую, собираю велосипеды из костылей и делюсь полезными материалами.

На данный идет только процесс обучения и попытки что-то создать.

@vecxylog
🔥4
Forwarded from Vecxy
⚙️Log #9

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

В общем, у нас есть экран HD 1920x1080.

WebGL в свою очередь рендерит все что помещается в диапазон от -1 до 1 как по X, так и по Y. Все что за пределами - не попадает в зону видимости. Собственно это clip space (пространстве отсечения).

Так вот, чтобы от рендерить экран - нам нужно его нормализовать. Это значит чтобы мы позиции точек по ширине в диапазоне от 0 до 1920 (видимый диапазон) - преобразовали в диапазон от -1 до 1 и тоже самое нужно сделать по высоте.

Для этого необходимо наши позиции точек разделить на наш размер экрана Screen (1080, 1920). Ну типа два вектора поделить между собой.
Например у нас точка на нашем экран P1, находится в таких координатах (200, 200)

Поэтому для преобразования в диапазон от -1 до 1 (нормализовать), нужно сделать P1 / Screen = (200 / 1080, 200 / 1920) = (~0,18, 0,10).
Результат округлил, чтобы не писать много цифр, но и webgl умеет тоже округлять качество значений с плавающей точкой через precision в шейдере.

Так вот, мы получили нормализованные координаты, но прикол в том, что они находятся в диапазоне от 0 до 1. Получается что наши позиции точек будут нахдоится где-то сверху в правой части экрана. Почему? Ну потому что webgl рендерит область от -1 до 1 и центр у него находится ровно в (0, 0). А так как у нас нормализованные координаты находятся от 0 до 1, то это справа сверху.

Здесь я не мог понять, потому что не хватало теоретических знаний, но до меня дошло, когда я начал рисовать это дело.

Так вот, помимо того, что у нас нормализованные координаты сверху справа, так они еще и в два раза меньше нашего экрана в конечном итоге.

Чтобы привести в нужный вид, нам необходимо сначала заскейлить это дело, ведь не гоже наши точки уменьшать, для этого нужно умножить на x2 и нормализованные координаты выйдут в диапазон от 0 до 2. Берем нашу нормализованную точку: P1 * 2 = (~0.18 * 2, ~0.10 * 2) = (~0,37, ~0,20).

Ну вот, теперь нормально. Однако, если координаты точки были бы больше 1, то в данный момент webgl их бы не от рендерил за пределами видимой области (clip space).

Теперь нам нужно сделать смещение / перемещение. Собственно так как у нас все находится по прежнему в правом верхнем углу экрана, то нам нужно это сместить ровно на 1 влево и на 1 вниз, потому что наш диапазон теперь от 0 до 2. Берем нашу нормализованную и отскейленную точку: P1 - 1 = (~0,37 - 1, ~0,20 - 1) = (~-0,63, ~-0,79).

Отлично! Теперь наши точки находятся в пределах видимости от -1 до 1 и они смещены в левый нижний угол экрана. Однако есть некое нечистое деяние, это не по стандарту, все должно быть относительно левого верхнего угла экрана. Почему? Ну погуглив и послушав больших дядек из этой области, понял что это маст хев, пока инфы по этому нет, но в вобщем и целом это сложилось исторически + согласованность, чтобы было во всех системах одинаково для упрощения.

Как нам это провернуть? Ну тут все тоже просто, достаточно умножить наши координаты точек на инверсивный вектор. Например сейчас у нас в левом нижнем углу, значит нам нужно поменять только позицию по высоте, отразить их. Для этого берем вектор (1, -1), где X будет 1, потому что нам не нужно менять позиции по X, но будет -1 по Y, чтобы отразить все координаты. P1 = (~-0,63, ~-0,79) * (1, -1) = (~-0.63 * 1, ~0.79 * -1) = (~-0,63, ~0.79)

А вот собственно и весь шейдер данной операции:
#version 300 es;

precision mediump float;

attribute vec2 a_position;
uniform vec2 u_resolution;

void main() {
v_color = a_color;

vec2 n_position = a_position / u_resolution;

vec2 sn_position = n_position * 2.0;

vec2 clip_space = (sn_position - 1.0) * vec2(1, -1);

gl_Position = vec4(clip_space, 0, 1);
}


P.S. На скрине все в кучу, но это было очень эффективно :D
Please open Telegram to view this post
VIEW IN TELEGRAM
В for-циклах ++i и i++ работают одинаково, но ++i теоретически чуть быстрее и используется как более оптимизированный стиль.

++i изменяет значение сразу, без создания временной копии.
i++ создает временный объект, который затем отбрасывается (в некоторых старых компиляторах это могло давать небольшой оверхед).
WebAssembly: Как «невозможное» стало реальностью? https://habr.com/p/892052

"wasm-революционеры... 

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

Вы сначала сами попробуйте сделать что-то на wasm, посмотрите на размер сборки, измерьте скорость на живом примере, покурите, подумайте..."

"Делал на js - sax парсер xml . Так вот работает он быстрее в разы(в 7-10 раз) чем бинарный expat или libxml.
WebAssembly нужная технология, но очень специфичные. И точно не серебряная пуля"

"Сколько я ни смотрел бенчмарков, везде преимущество в скорости WASM было скажем так неочевидно. Да, в узких кейсах может быть преимущество 2-3-5х (откуда автор взял 10х?), но глобально по больнице - приблизительный паритет, иногда даже немного медленнее было. Оговорюсь, что смотрел я это год-два назад, может сейчас что-то поменялось"

#save