| Направление с анимацией Curve | 
|  | 
| 
| Spring | Дата: Вторник, 22 Февраля 2022, 12:38 | Сообщение # 1 |  |   частый гость Сейчас нет на сайте | У объекта есть направление и анимация curve, мне нужно, чтобы анимация подстраивалась под направление, но как это сделать я не знаю. Вот изначальный код:
 
 Код public Transform Target;
 public Vector3 MoveDirection;
 public AnimationCurve CurveAnim;
 float curveTime;
 void Start () {
 MoveDirection = Target.position - transform.position;
 MoveDirection = MoveDirection.normalized;
 CurveAnim = new AnimationCurve
 (new Keyframe(0, -1), new Keyframe(1, 1), new Keyframe(2, -1));
 CurveAnim.preWrapMode = WrapMode.Loop;
 CurveAnim.postWrapMode = WrapMode.Loop;
 }
 void Update () {
 transform.Translate(MoveDirection * Time.deltaTime);
 curveTime += Time.deltaTime;
 transform.position = new Vector3(transform.position.x, CurveAnim.Evaluate(curveTime), 0);
 }
Все мои попытки сделать то что я хочу были тщетны.
 
 Вот визуализация:
 
 Красная линия тот как он сейчас движется.
 Зелёная линия тот как он должен двигаться.
 
 Желательно чтобы решение не представляло собой вращение всего объекта.
 
 
 Сообщение отредактировал Spring - Вторник, 22 Февраля 2022, 13:09 |  |  |  |  | 
| 
| DmitriyIM | Дата: Вторник, 22 Февраля 2022, 21:05 | Сообщение # 2 |  |   частый гость Сейчас нет на сайте | Цитата Spring (  )  Желательно чтобы решение не представляло собой вращение всего объекта. 
 Нужно вращать, а точнее добавлять к:
 
 Цитата Spring (  )  Код transform.position = new Vector3(transform.position.x, CurveAnim.Evaluate(curveTime), 0);
 cos и sin от угла направления.
 |  |  |  |  | 
| 
| drcrack | Дата: Вторник, 22 Февраля 2022, 21:34 | Сообщение # 3 |  | старожил Сейчас нет на сайте | оставь cos и sin для уроков геометрии, в юнити есть инструменты поудобнее но нужно хранить виртуальную позицию до применения анимации
 
 Код Vector3 position;
 void Start () {
 // ......
 position = transform.position;
 }
 
 void Update () {
 position += MoveDirection * Time.deltaTime;
 transform.position = position + Quaternion.LookRotation(MoveDirection) * new Vector3(0, CurveAnim.Evaluate(Time.time), 0);
 }
 |  |  |  |  | 
| 
| Spring | Дата: Вторник, 22 Февраля 2022, 21:45 | Сообщение # 4 |  |   частый гость Сейчас нет на сайте | drcrack, Благодарю! |  |  |  |  | 
| 
| DmitriyIM | Дата: Вторник, 22 Февраля 2022, 22:08 | Сообщение # 5 |  |   частый гость Сейчас нет на сайте | Цитата drcrack (  )  оставь cos и sin для уроков геометрии, в юнити есть инструменты поудобнее
 А что там у этих инструментов внутри, магия?
  Если человек поймет алгоритм, он и без них сможет все сделать.... 
 Для меня понимание, всегда важнее, чем поиск готового ответа. Если я не прав, то извини
   |  |  |  |  | 
| 
| Spring | Дата: Вторник, 22 Февраля 2022, 23:01 | Сообщение # 6 |  |   частый гость Сейчас нет на сайте | Цитата DmitriyIM (  )  Для меня понимание, всегда важнее, чем поиск готового ответа.
 Цитата DmitriyIM (  )  Нужно вращать, а точнее добавлять к: "код"cos и sin от угла направления.
Этот ответ мне даёт только больше вопросов, я не прочь узнать алгоритм, но мне нужен ответ.
 |  |  |  |  | 
| 
| drcrack | Дата: Среда, 23 Февраля 2022, 05:14 | Сообщение # 7 |  | старожил Сейчас нет на сайте | Цитата DmitriyIM (  )  А что там у этих инструментов внутри, магия? Если человек поймет алгоритм, он и без них сможет все сделать....Для меня понимание, всегда важнее, чем поиск готового ответа. Если я не прав, то извини
Если новичку пытаться разобраться как все работает под капотом, на игру времени не останется
 Достаточно знать как повернуть вектор посредством умножения на кватернион, а детали как это работает слишком низкоуровневые чтобы иметь практическое применение в большинстве случаев
 И вот еще пара причин почему ответ "cos и sin от угла направления." плохой:
 1) работает только в самом примитивном случае, ломается при добавлении третьего измерения в анимацию/движение
 2) все равно нужно хранить позицию до анимации о чем ты не упомянул
 |  |  |  |  |