Страница 1 из 1

Помогите определить направление движения CharController

СообщениеДобавлено: 22 окт 2012, 20:12
CoreRaySpark
Здравствуйте! Вопрос знатокам. Мне нужно знать направление движения CharacterController.
Допустим, есть персонаж, который умеет двигаться вперед, назад, влево и вправо (стрейфиться, проще говоря)
Мне нужно привязать к нему анимации, в зависимости от направления его движения.
Изображение
Персонаж управляется только скриптами, без Инпутов. Сейчас проблема убого решена следующим способом: берется велосити контроллера, если
оно больше нуля, начитается замер угла движения, относительно переда (transform.TransformDirection(Vector3.forward)), через функцию Vector3.Angle().
Минус этого способа в том, что программа не различает лево и право. Угол выдает 90 градусов и в том и в другом направлении.
Что делать, как с этим бороться?

Re: Помогите определить направление движения CharController

СообщениеДобавлено: 22 окт 2012, 20:59
Левш@
Что делать, как с этим бороться?

Использовать правильный алгоритм.

Re: Помогите определить направление движения CharController

СообщениеДобавлено: 22 окт 2012, 21:03
CoreRaySpark
Спасибо, очень помогло! >_>

Re: Помогите определить направление движения CharController

СообщениеДобавлено: 22 окт 2012, 21:26
KBEP
Пока решили проблему костылём:
1. Находим угол между трансформ.форвард и КарактерКонтроллер.велосити. Если меньше 90, то имеем движение вперед, если больше 90 - назад.
2. Находим угол между трансформ.райт и КарактерКонтроллер.велосити. Если меньше 90, то движение вправо, если больше - влево.
Наверняка есть и более элегантное решение, но мы пока его не нашли :-\

П. С.: Спарк, отпишись, как выглядит итоговый код, может кому пригодится.

Re: Помогите определить направление движения CharController

СообщениеДобавлено: 22 окт 2012, 22:05
CoreRaySpark
Вышло то что вышло:
Синтаксис:
Используется javascript
function Update ()
{
        var moveDirection : Vector3 = controller.velocity;
        var forwardAngle : float = Vector3.Angle(moveDirection, transform.TransformDirection(Vector3.forward));
        var sideAngle : float = Vector3.Angle(moveDirection, transform.TransformDirection(Vector3.right));
       
       
        if (forwardAngle < 45)animation.CrossFade("Run");
        else if (forwardAngle > 110)animation.CrossFade("BackWalk");
       
        if (sideAngle < 50)animation.Blend("StrafeR", 0.7, 0.3);
        else animation.Blend("StrafeR", 0.0, 0.3);
        if (sideAngle > 110)animation.Blend("StrafeL", 0.7, 0.3);
        else animation.Blend("StrafeL", 0.0, 0.3);
       
        animation["Run"].speed = moveDirection.magnitude/4;
        animation["BackWalk"].speed = moveDirection.magnitude/4;
        animation["StrafeR"].speed = moveDirection.magnitude/4;
        animation["StrafeL"].speed = moveDirection.magnitude/4;


Значения сугубо личные, ибо тестировать надо

Re: Помогите определить направление движения CharController

СообщениеДобавлено: 27 окт 2012, 18:47
AndreyMust19
По-хорошему надо переносить controller.velocity в локальную систему координат (отн-но transform.forward). Тогда координаты локальной скорости можно использовать как веса и скорости в воспроизведении анимации (при условии что в стандартной позе все персонажи смотрят в ось Z).
Например, локальная скорость = (0.25, 0, 0.75). В этом случае анимация бега вперед будет воспроизводиться со скоростью 0.75, а стрейфа - со скоростью 0.25, анимация прыжка/падения воспроизводиться не будет. Вес = (0...1), для него вектор надо укоротить до длины 1 (нормализовать).

Re: Помогите определить направление движения CharController

СообщениеДобавлено: 27 окт 2012, 20:18
CoreRaySpark
Вот такого подхода я и ждал! Я тоже думал и про скорость и про вес анимации. Знаю как это организовать, но вот как измерить относительное ускорение, так и не допер(

Re: Помогите определить направление движения CharController

СообщениеДобавлено: 27 окт 2012, 21:01
AndreyMust19
как измерить относительное ускорение, так и не допер(

Очень просто - умножаем controller.velocity на transform.rotation. В результате вектор поворачивается в локальную систему координат (поскольку transform.rotation - это и есть ориентация системы координат объекта относительно глобальной системы координат. Приведенный способ верен, если у персонажа нет родительского объекта, в противном случае исп-ся отдельная функция transform.InverseTransformPoint(Vector3).

Re: Помогите определить направление движения CharController

СообщениеДобавлено: 27 окт 2012, 21:51
CoreRaySpark
Товарищ, я бы Вам руку пожал! Сейчас не могу попробовать, но пост записал) было бы здорово наконец сделать то, что планировал) Спасибо!