Melkov's
168 subscribers
582 photos
76 videos
39 files
221 links
Мой движок: @vecxylog
Чат: @melkovteam
Download Telegram
😁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
Forwarded from Vecxy
This media is not supported in your browser
VIEW IN TELEGRAM
⚙️Log #12

Спрайт, над которым теперь можно делать преобразования — скейлить, вращать и менять позицию.

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

Затем познакомился с аффинной матрицей. Она позволила мне описывать такие преобразования, как масштабирование, поворот и перемещение в 2D-пространстве. Однако, всё ещё есть некоторые шероховатости в понимании, как именно она работает в контексте 2D. Планирую на следующей неделе посвятить ещё несколько дней этому вопросу и углубиться в практику, чтобы лучше разобраться.

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

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

В этом туториале очень качественно эти преобразования объясняются и визуально демонстрируют в софте Nuke Studio. Сегодня себе его установил, чтобы по CG всякие штуки визуально закреплять.

Также поэкспериментировал с ортографической проекцией. Это позволило моему спрайту отображаться одинаково, независимо от его положения относительно камеры. Таким образом, он не искажается при удалении или приближении камеры. Камеру, правда, я еще не реализовал — пока что нужно больше практики в матрицах.

В общем, потрогал много всего, было много трудностей и косяков, но в итоге получилось то, что можно посмотреть в видео. Теперь буду более детально разбирать эти моменты и пробовать разные подходы, чтобы всё закрепить и действительно освоить.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2