И теперь не может его никуда загрузить, поэтому вот вам видео с этой потрясающей детализацией, всего 702 мегкапикселя, разрешение 21956x32000 пикселей!
Вот так проходил рабочий процесс:
ComfyUI - стандартный рабочий процесс > Изображение > SD Upscale 1,5x > Повторить 6 раз > Сохранить > Ретуширование > Увеличение масштаба 2,38x и резкость с Topaz AI.
Интересуешься нейросетями? Тебе в источник - 🎯Нейро-Пушка!
Для тех кто первый раз читает мой гоблинский блог - расскажу кратко что тут происходит. Я сам являюсь зеленым новичком в разработке игр и в своем блоге описываю этапы изучения столь сложного дела. На данный момент - это работа с движком Godot 4.
Чтобы не мучать вас длинными статьями, я разбиваю этот путь на кучу мелких блоков. Один пост - одна механика движка. Все гоблинские заумные слова расшифровываются на человеческий, так что даже пациент из Кащенко поймет о чем речь. Погнали!
● Создание сцены с персонажем:
В прошлой статье мы создали редактор карт с автоматическим заполнением, кто не читал - почитайте, будет полезно. Теперь нам нужно сделать персонажа, которым мы будем бегать по данной карте. Для этого нам нужен узел типа "CharacterBody2D", на основе которого мы и создаем новую сцену. Сделать это можно выбрав вкладку "Другой узел".
Как выглядит узел "CharacterBody2D"
● Визуальное изображение персонажа:
Узел это конечно хорошо, но мы пока ни черта не видим - нам нужен визуальный образ. Добавляем дочерний узел "Sprite2D". В его настройках находим вкладку текстуры и добавляем иконку Godot. В будущем мы заменим спрайт на анимацию, но пока нам хватит такой затычки.
Узел "Sprite" -> Texture -> Быстро загрузить
● Настройка зоны столкновения:
Чтобы наш персонаж не проваливался в текстуры и реагировал на поверхности мы должны настроить зоны столкновения. В прошлом уроке мы работали со слоем Collision в нашем TileMap. Тут же мы добавляем узел "CollisionShape2D", который представляет из себя выделение зоны столкновения в виде простой геометрической фигуры. Вид этой фигуры мы выбираем во вкладке "Shape".
Узел "CollisionShape2D" -> Shape -> Новый RectangleShape2D
● Начальные данные для физики и управления:
Создаем скрипт для нашей сцены и первым делом зададим константы. Константа - это постоянное значение, которое не будет меняться в ходе работы программы.
Чтобы создать константу мы пишем: const название_константы = значение
Переменные же создаются по другому: var название_переменной = значение
Давайте разберемся за что отвечают указанные нами значения:
speed и acceleration - от этих значений будет зависеть скорость передвижения по оси X (влево-вправо)
jump_velocity - это значение влияющее на высоту прыжка. Ось Y в Godot перевернута с ног на голову и отрицательное значение означает вверх.
friction - значение влияющее на скорость остановки при прекращении передвижения.
Так выглядят наши константы в коде
Так же мы добавляем значение гравитации, однако оно выставляется из внутренних настроек проекта.
var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
● Общая функция для управления персонажем:
Задав исходные данные мы можем приступать к настройкам функций нашего персонажа. Для этого мы пишем стандартную функцию Godot:
func _physics_process(delta):
Для тех кто не знает - эта функция вызывается перед каждым физическим кадром, который привязан к физическому fps, он по умолчанию равен 60 раз в секунду.
var input_axis = Input.get_axis("ui_left","ui_right")
Get_axis - это функция которая присваивает переменной одно из двух значений при нажатии одной из двух кнопок. Первое значение равно -1 и задается при нажатии клавиши "влево". Второе же равно 1 и задается при нажатии клавиши "вправо". Если на момент кадра не нажата ни одна из этих кнопок, значение равно 0. Это позволяет нам определить нужное направление для изменения координат персонажа.
Влево = -1 | Вправо = 1 | Стоим на месте = 0
● Движение по оси X (влево-вправо), создаем новую функцию:
handle_acceleration (input_axis, delta)
В нее мы добавляем условие, что должна быть нажата одна из клавиш - влево или вправо.
if input_axis !=0:
Если данное условие выполнено, то мы совершаем перемещение в заданном направлении. Для этого используется функция move_toward.
velocity.x - это переменная отвечающая за перемещение по оси X.
В move_toward мы задаем три параметра через запятую. Изначальная точка, точка в которую мы должны прийти, шаг в сторону нужной точки за один кадр.
Каждый кадр мы двигаемся в выбранную сторону, начальная точка меняется и это создает замкнутый круг движения. А чтобы его запустить, мы добавляем нашу функцию под physics_process и в конце пишем move_and_slide().
move_toward ( начальная точка, точка прибытия, расстояние шага за один кадр )
▸ А где тормоза то !?
● Как сделать остановку?
Мы начали двигаться и если не нажмем кнопку в противоположную сторону - улетим за край карты. Чтобы разорвать наш круг постоянного движения мы должны сделать функцию тормоза.
Копируем нашу прошлую функцию и переименовываем ее:
handle_friction (input_axis, delta):
Так же меняем заданное условие, input_axis должен быть равен нулю. Главное помнить, что знак равенства при сравнении выглядит вот так "==".
if input_axis == 0:
В функции move_toward заменяем значения. Первое остается прежним, на втором ставим ноль, а на третьем стираем acceleration и пишем friction. Все это в сумме обеспечит нам быструю остановку.
Функции обратные друг другу
● Движение по оси Y (прыжок, гравитация), создаем новую функцию:
aplay_gravity(delta):
Если мы не на земле, то бишь в воздухе - нас должно тянуть вниз.
if not is_on_floor():
velocity.y += gravity * delta
Ставим именно "+=", так как это сделает плавное падение с нарастающим ускорением. Не забудьте умножить на delta, иначе все произойдет за долю секонды.
● Следующая функция для прыжка:
handle_jump(delta):
Для нас важны два условия - нахождение на земле в момент прыжка и нажатие нужной клавиши.
if is_on_floor() and Input.is_action_just_pressed("ui_accept"):
Если данное условие соблюдено мы приравниваем параметр оси Y к значению высоты прыжка.
velocity.y = jump_velocity
Добавляем эти функции под physics_process, а после переходим на сцену "world". Туда из общего списка ресурсов перетаскиваем сцену "player".
.tscn - это формат сцены в Godot
Как выглядит наш блок с функциями
● Что у нас получилось в итоге?
✓ Если вы нажимаем клавишу влево или вправо - персонаж двигается в выбранном направлении.
✓ Если ни одна из клавиш направления не нажата - мы останавливаемся.
✓ Если мы находимся в воздухе - нас тянет вниз с каждой секундой все сильнее.
✓ Если находясь на земле, мы жмем прыжок - нас подкинет вверх.
▸ Оно живое!
Вот так при помощи четырех простых функций мы создали основу физики и управление персонажем. Надеюсь разобрал каждый шаг максимально подробно и понятно.
✓ Зеленые новички - крепитесь и подписывайтесь, скоро новая статья. На очереди две темы - "анимация персонажа" или "двойные прыжки и прыжки от стены".
✓ Опытные шаманы - запасайтесь успокоительным, ибо дальше будет еще куча попыток освоить gamedev.
✓ Ну и все кто имеет свое мнение, поддержку или усмешку - пишите комменты!
Мы уже знаем как делать гайды и пошаговые инструкции Scribe AI. Но как быть, если нужно записать видеогайд? Поможет Guidde— расширение для Google Chrome
После установки расширениядостаточно кликнуть на Guidde в установленных расширенияхChrome, и начнется запись экрана. Сервис сам выделит области и кнопки, на которые вы нажимали, и опишет ваши действия, русский язык присутствует
Идеально для создания видеоуроков и онлайн-курсов
Плюсы и минусы:
Можно выбрать генерировать на русском языке, и сервис опишет действия на русском языке
Можно записать голос или воспользоваться готовыми шаблонами
Можно добавить субтитры
Можно добавить классные эффекты
Скачать можно только на платном тарифе от 16$/мес
Хотите быть в курсе о полезных ии сервисах для работы, учебы и облегчения жизни? Вам в НейроProfit 🤗
Сразу к делу: Вам необходимо установить Stable Diffusion на iPhone, чтобы генерировать картинки бесплатно и офлайн, то есть скачайте из AppStore приложение: Draw Thing в котором и собраны нейросети. └ Но есть несколько нюансов: у вас должна быть модель iPhone с процессором A12 Bionic и выше, а также придется выделить 2 Гб памяти на установку моделей.
Вы сможете генерировать видео в разделах #generate как по текстовому запросу, так и на основе картинки. Чтобы прикрепить изображение, нажимаете рядом с вбитым промптом на +1, затем нажимаете на Upload и добавляете.
Вот пример промпта:
/create prompt:a dog is walking in the forest, sunrise, 4K -neg "bad anatomy, lowres" -ar 1:1
Какие есть параметры у промптов:
-gs xx (guidance scale, чем выше цифра, тем ближе визуал к запросу)
-neg "xxx" (негативный промпт)
-hide (скрыть промпт)
-ar xx:xx (соотношение сторон)
-seed xxx (сид: ставим одно число для генерации, чтобы увидеть сид надо скачать видео он в названии файла)
-motion xx (насколько подвижной нужна картинка, задаётся числами 0, 1, или 2)
Чтобы быстро генерировать визуал по тому же промпту жмите на "Повторить". Генерации ограничены 10 штуками в 5 минут.
- Сохраните файл с моделью в папку data\models\sd внутри проекта.
Настройка и выполнение:
10. Откройте файл config\prompts\01-ToonYou.json для настройки:
- В строке "path": "models/sd/PlasticGamma-v1.0.safetensors", удалите текст models/sd/PlasticGamma-v1.0.safetensors и замените на путь к загруженной модели в папке data\models\sd.
- В строке "motion_module": "models/motion-module/mm_sd_v14.ckpt", удалите текст models/motion-module/mm_sd_v14.ckpt и замените на путь к загруженной модели движения SD-14 в папке data\models\motion-module.
- Чтобы изменить пример текста, замените строки "prompt": "Text prompt goes here" и "negprompt": "Negative prompt goes here" на нужный вам текст.
11. Выполните команду для генерации анимации:
animatediff generate
12. По умолчанию, результат будет сохранен в папке outputs\.
Обновление репозитория:
13. Если вы хотите обновить репозиторий в будущем, выполните следующую команду:
git pull
Важно: Убедитесь, что все команды выполняются в директории проекта AnimateDiff CLI.
Нейронка генерирует панорамы из запросов. Пишете, какой мир вокруг себя хотите видеть, а сервис нарисует реалистичную 3D-сцену. Залипнуть — https://skybox.blockadelabs.com