Делаем кривую Безье в Unity !
Вставка
- Опубліковано 1 жов 2024
- Ссылка на скрипты из урока - cloud.mail.ru/...
В этом уроке показываю как в Unity создать кривую Безье. Пишем код на C#.
Обычно в компьютерной графике используется построение кривой по 4-м точкам, как я и показываю в видео. Но можно провести ее и через 3 точки, а также через произвольное число точек. В Википедии есть гифки как это выглядит.
ru.wikipedia.o...
Классное видео, хочется увидеть как генерить большие сплайны:3
Магия Безье пропала, теперь это подвластно простым смертным! ) Спасибо огромное, так доходчиво никто не объясняет! )
Вот это совпадение! У создателя кривой Безье была фамилия Безье!
Я думал это что-то очень сложное, содержащие в себе всю высшую математику, а это оказалось не так уж и сложно! Спасибо за информацию.
тут 854 лайк, где видос про большой сплайн ?)
Отличное видео! Ваш канал, как клад для меня, очень редко удаётся найти какую-то русскоязычную, не банальную информацию по этому движку.
Спасибо)!
Банальный вопрос, анальный ответ
Хороший канал. Где активность подписчиков ? О_о
У тебя тоже хорошие видео на канале
что так все пугаются производных? это же просто разница между первым результатом функции и втором выраженная функцией
А где обещанное продолжение?)
Вроде бы вот оно, алгебра и геометрия пригодились.
Только вот толку? Все забыто было уже через месяц после контрольных.
Еще одно подтверждение, что нахер не нужно все это в школе изучать без надобности.
Мне понадобилось - сейчас сяду и разберусь.
Лучше б гулял, вместо этой конченной школы, где я на пятерки учился.
Я сделал несколько участков, но у меня скорость объекта на каждом участке разная. Из-за длины участка, очевидно. Кто-нибудь знает как справиться с этим?
кто ждет видео с большим сплайном, поставьте лай, что автор заметил
Отличное видео, но где продолжение с большим количеством точек?
Илья - учитель от бога👍
Смотрится интересно и понятно с порцией шуток и частичкой научности.
Смотрю когда на канале больше тысячи лайков, очень хочется урок про большой сплайн🙏
Надеюсь когда нибудь попаду на твой курс, большое спасибо за труды
Что там по поводу путей с помощью кривой безье?
Их можно использовать для системы строительства дорог.
Шутка со старштклассником огонь!
Где обещанное продолжение?)
Почему нет продолжения????
А когда будет урок по путям безье ?
можно было бы вынести эти 4 аргумента в отдельный класс + степени с помощью Mathf.Pow() сделать(если не ошибаюсь). Ролик классный, спасибо
Хочу увидеть урок большие сплайны
Илья, ты выпустил ролик по большим сплайнам?) Запрос на него остался - ты очень интересно рассказываешь и доступно объясняешь, так что не давай таланту простаивать.)
Великолепно
Ждём видео про большой сплайн
Очень круто, сними видео пожалуйста про то, как сделать канат через точки, в целом заполнение кривой объектами, это будет удобно для создание дорог путей, веревок и т.д. 1:37
лютая годнота!
Опять ебучие производные вспомнить пришлось) инфа Вери полезная, спасибо, ты классный
Спасибо! Мне требовалось реализовать этот алгоритм на другом языке программирования, не связанный с Unity, но все равно воспользовался вашим объяснением из начала ролика, чтобы понять принцип.
спасибо, довольно полезный и интересный инструмент)
Спасибо большое за ваш труд, это видео буквально спасло меня)
а для чего нужен Mathf.Clamp01
Приветствую! Кстати лайков больше 2к, а ты обещал продолжение по кривым.
Математику не боимся. У меня по вышке 5 было еще в 70-х годах
Можно пожалуйста для самых маленьких и тупых, как заставить объект автоматически двигаться по безье
А можно продолжение увидеть? чтобы траектории строить
1.5 к лайков, а продолжений видео нету... Ну ешки кошки...
Что за подстава?
А ещё так приятно видеть как пригождаются производные
Не на что не намекаю, но было бы здорово, если был бы курс по математика в геймдеве русскоязычный ))
Спасибо огромное! Использовал твой урок для создания скрипта удобного спавна и последующей настройки в редакторе элементов по кривой. Пилю игру на ЯИ. :)
Я вот тут подумал: может быть успех твоей первой игры на ЯИ как-то связан с твоей кармой??? )))
Классное видео
Привет. Ты сказал что если будет 300 лайкщв , сделаешь про длинную кривую видос. ))
Подписка
Одно из самых шикарных видео по юнити.
Как сделать, чтобы в 2D работало на спрайтах?
Ты очень крутой. Лайк и подписка.
Действительно полезное видео
Объяснил всё просто шикарно
Я думаю подбирать монетки таким образом, отличное применение кривых Безье
Вероятно воспользуюсь этим
Первый в жизни лайк поставил, чел, СПАСИБО ОГРОМНОЕ!!!
Кстати, когда видос про большую курву?
Было бы круто, если бы Вы делали больше материала по всяким штукам из математики(алгоритмам) которые исрользуются в играх. Что бы их можно было бы применить в Unity. Так как таких видео очень мало на русском языке. Можно взять материал из канала Sebastian Lague. Было бы круто, если бы вы его адаптировали на русский язык. Спасибо за видео, было очень интерестно узнать про кривую Безье. Я уверен такой алгорит пригадится мне в будущем.
Да, мне нравится канал Sebastian Lague. Буду на него ориентироваться.
@@EccentricGames лайки подбираются к 300, поэтому есть надежда увидеть видео про большие сплайны :). Но, на самом деле, больше хочется увидеть не столько большие сплайны (их можно сделать после просмотра данного ролика по образу и подобию), а как подобные вещи делаются через editor. Как я понял, если делать через monobehaviour, то при билде игры объект с кривыми остается в сцене, а при работе через editor его не будет. У Sebastian Lague курс, конечно, крутой, но не хватает подробностей механизма работы классов эдитора и его взаимодействия с monobehaviour. В любом случае спасибо, т.к. это видео мне здорово помогло.
Уже 700 лайков записывай видео!!!!
О господи боже мой, пол года назад учил производную и забыл, не думал что такое может пригодиться, фантастика
takie godnie veshi i iest ochen lubimi vashi dlia polzovateliax zaslujenni like tebe bravo i vot t ak derjis
Для тех кто хотел скрипт по кривым высокого порядка (с большим количеством точек):
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class BezierRoad : MonoBehaviour
{
private Vector3[] _points;
[SerializeField]
private Transform[] _knees;
[Range(0, 1)]
public float t;
[SerializeField]
private Transform _movableObject;
private void Awake()
{
_points = new Vector3[_knees.Length];
for (int i = 0; i < _knees.Length; i++)
_points[i] = _knees[i].position;
}
private void OnDrawGizmos()
{
_points = new Vector3[_knees.Length];
for (int i = 0; i < _knees.Length; i++)
_points[i] = _knees[i].position;
int sigmentsNumber = 20;
Vector3 preveousePoint = _points[0];
for (int i = 0; i < sigmentsNumber + 1; i++)
{
float paremeter = (float)i / sigmentsNumber;
Vector3 point = CalculateBezierPoint(paremeter, _points.ToList());
Gizmos.color = Color.white;
Gizmos.DrawLine(preveousePoint, point);
Gizmos.color = Color.green;
for (int j = 0; j < _points.Length - 1; j++)
Gizmos.DrawLine(_points[j], _points[j + 1]);
preveousePoint = point;
}
}
private void Update()
{
_movableObject.position = GetPointOnBezierCurve(_points.ToList(), t);
}
public static Vector3 GetPointOnBezierCurve(List controlPoints, float t)
{
int n = controlPoints.Count - 1; // порядок кривой
Vector3 point = Vector3.zero;
for (int i = 0; i
я понимаю, что давно неписан коммент, но мало ли) Как в этом коде поворачивать объект вдоль кривой?
@@RalanMad я плохо понял ваш вопрос, к сожалению сейчас не могу уделить ему время, но я закинул в чат гпт и он выдал вот такое решение. Решение я не тестировал, но надеюсь это вам поможет:)
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class BezierRoad : MonoBehaviour
{
private Vector3[] _points;
[SerializeField]
private Transform[] _knees;
[Range(0, 1)]
public float t;
[SerializeField]
private Transform _movableObject;
[SerializeField, Tooltip("Малое значение для вычисления тангенса")]
private float deltaT = 0.01f;
private void Awake()
{
_points = new Vector3[_knees.Length];
for (int i = 0; i < _knees.Length; i++)
_points[i] = _knees[i].position;
}
private void OnDrawGizmos()
{
_points = new Vector3[_knees.Length];
for (int i = 0; i < _knees.Length; i++)
_points[i] = _knees[i].position;
int segmentsNumber = 20;
Vector3 previousPoint = _points[0];
for (int i = 0; i < segmentsNumber + 1; i++)
{
float parameter = (float)i / segmentsNumber;
Vector3 point = CalculateBezierPoint(parameter, _points.ToList());
Gizmos.color = Color.white;
Gizmos.DrawLine(previousPoint, point);
Gizmos.color = Color.green;
for (int j = 0; j < _points.Length - 1; j++)
Gizmos.DrawLine(_points[j], _points[j + 1]);
previousPoint = point;
}
}
private void Update()
{
// Получение текущей позиции на кривой
Vector3 currentPos = GetPointOnBezierCurve(_points.ToList(), t);
// Вычисление предыдущей позиции для направления движения
float adjustedT = Mathf.Clamp01(t - deltaT); // Ограничиваем t, чтобы оно не вышло за пределы [0, 1]
Vector3 previousPos = GetPointOnBezierCurve(_points.ToList(), adjustedT);
// Определение направления движения
Vector3 direction = (currentPos - previousPos).normalized;
// Установка позиции объекта
_movableObject.position = currentPos;
// Вращение объекта по направлению движения
if (direction != Vector3.zero) // Проверяем, чтобы избежать вращения, если нет направления
{
_movableObject.rotation = Quaternion.LookRotation(direction);
}
}
public static Vector3 GetPointOnBezierCurve(List controlPoints, float t)
{
int n = controlPoints.Count - 1; // порядок кривой
Vector3 point = Vector3.zero;
for (int i = 0; i
1.5к лайков есть, а проды нет(
12:46 достаточно канала "Математика без х**ни")
Где видео про большой сплайн?))
Очень крутое видео, спасибо за него, но Вы могли бы объяснить как объединить несколько кривых в одну, как у Вас в начале видео
Где видео с большим количеством точек?
Наберем 300 господа!
А как запустить движение при старте?
наконец-то я понял, что такое lerp!!!
Привет, интересный урок, давайте лайкайте интересно продолжение.
Где видео про большой сплайн?
-Сейчас будет немножечко математики, не пугайтесь!
как у зубного: "а сейчас будет немножечко больно" :D
Так продолжение то будет?
ты просто лучший! максимум полезной информации за 14 минут
Он все ещё не сделал сложную безье (
У меня постоянно Юнити намертво зависает при визуальном построении кривой через Гизмос. При сохранении префаба - тоже
Саша, ты ювелир
Спасибо, очень интересно и доступно объяснено. Давайте еще сделаем симуляцию физики для веревки, провисание. И чтобы тень отбрасывала от источников света.
777 лайков. 22 мая 2021-го.
А можно ли сделать безьё в качестве лески для удилища? Ну,для своей игры.
Можно конечно но зачем
Стоит явно упомянуть, что безье можно строить на произвольном количестве точек. И как-то мне проще понимать формулы было если начинать расписывать с двух точек, хотя лерп тоже для по своему удобен.
Да, согласен, стоило упомянуть
А как это реализовать через код?
а как сделать кривую для прыжка регулировать прыжок я где-то видел и забыл как это называется
Скорее всего ты говоришь про Amination Curve=)
Кстати, 7 месяцев прошло, как с проектом?
Как можно изменить ротацию объекта на определённых промежутках ?
Увлекательно 😊
для дракона самое то, для полета хех
Очень хороший урок, большое спасибо! Жаль, что про большой сплайн видео так и не вышло :))))))
Интересная инфа, спасибо
Благодарю, очень понятно рассказываете! Продолжайте 😎
Очень полезный урок. Я думаю, даже - уникальный. Молодец!)
Геометрический способ рисовать кривую Бизье на 2:00 понятен, способ управления кривыми через точки с ручками на 0:30 понятен. Но не совсем очевидно, как они связаны. Получается, если мы возьмем среднюю точку на 0:30 на правом отрезке с желтыми точками, то это будет p1, верхнюю на том же отрезке - p0? Можно как-то наложить отрезки с 0:30 на 2:00?
Привет, есть вопросик, как можно адаптировать скрипт, чтобы можно было добавлять точек сколько угодно? мне нужно реализовать в игре чтобы камера следовала за персонажем по определенной траектории(как в игре little nightmare) в общем так чтобы я просто расставил по уровню точки по которым должна бегать камера, и сделать скрипт в котором камера следует за гг, если остальное я могу сделать, а вот как адаптировать твой код на дофига точек я хз(
Отлично. Коротко, понятно, интересно.
А когда будет видео про большой сплайн?) Тут лайков уже на 3-4 таких урока)))
Супер, Классное видео!!! Подскажи пожалуйста книги по изучению векторов и всех формул и как ты научился их адаптировать по юнити на C#?
Пожалуйста скинь исходник безье только с массивом точек, а не с четыремя, я буду мега благодарен
Я только не очень понимаю по производной. Производная в линейной получается число целое а в Кубической и далее уже с переменными. Написал код для любых порядков а вот как прикрутить вращение к ним не пойму.
Невероятно) спасибо. Кстати, помни, что обучающие видео по 3d собирают 3к - 30к. Тут же целое программирование, просмотров будет меньше. Но это не повод прекращать! Ведь 200+ человек у тебя научились, они с тобой. Это очень много) продолжай)
Если нужно определить именно направление, то нет никакой нужды брать производную, т.к. кривая Безье направлена по касательной к последниму из вот этого каскада отрезков.
А как сделать чтобы не приходилось вручную пермещать полузнок с значениями переменной t ,а чтобы как в игре про уток они сами летали о указаной таректории
Наконецто...Больше года искал этот туториал.
Расскажите пожалуйста про Сплайн Эрмита на с#, прошу вас.
Спасибо Вам. )))
Когда я учил матан и линал, любил представлять как двигаются точки, графики и фигуры у себя в голове чтоб понять суть. Здорово что теперь это можно сделать с помощью Юнити.
Спасибо большое за красивое, интересное, информативное, но легкое для понимания видео!
Чувааак, ты обязан сделать продолжение, я без него жить не смогу! Реально, пожалуйста
Круто !
Хочу больше видимо на математические тематики
А как двигать объект по кривой Безье равномерно?
Народ, поворот в сторону движения по кривой можно сделать проще. И для этого не нужно ничего писать в Bezier.
Написано всё в апдейте, если кто не понял
// Позиция в предыдущем кадре
Vector3 positionBefore = transform.position;
// Расчёт нынешней позиции (из видео)
transform.position = Bezier.GetPoint(P0.position, P1.position, P2.position, P3.position, t);
// Вектор направления
Vector3 direction = (transform.position - positionBefore).normalized;
// Поворот в сторону движения
transform.rotation = Quaternion.LookRotation(direction, Vector3.up);
И ещё. Если вас раздражает сообщение в дебаге о том, что вектор направления равен нулю, можете последнюю строчку заменить на это:
if(direction != Vector3.zero)
transform.rotation = Quaternion.LookRotation(direction, Vector3.up);
Это некорректно. В рамках какой-то одной вашей задачи оно может работать, но если реализация будет к примеру такой, что в одном кадре точка рассчитывается на 30%, а в следующем кадре на 60%, тогда вектор в вашем алгоритме будет направлен от позиции в 30 к позиции в 60, а должно быть (условно) от 59.(9) к 60!
@@skarabeydm А здесь явно показана еще одна возможная проблема, что движение в двух кадрах будет минимальным настолько, что float внутри Vector3 округлится к нулю и тогда поворот не будет осуществлен вовсе
Ты просто гений! :) Огромное тебе спасибо, лайк+подписка! Желаю тебе удачи во всех твоих идеях и существующих задачах :)