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

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

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

Сообщение CoreRaySpark 22 окт 2012, 20:12

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

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

Сообщение Левш@ 22 окт 2012, 20:59

Что делать, как с этим бороться?

Использовать правильный алгоритм.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

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

Сообщение CoreRaySpark 22 окт 2012, 21:03

Спасибо, очень помогло! >_>
Аватара пользователя
CoreRaySpark
UNец
 
Сообщения: 23
Зарегистрирован: 17 окт 2012, 21:54

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

Сообщение KBEP 22 окт 2012, 21:26

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

П. С.: Спарк, отпишись, как выглядит итоговый код, может кому пригодится.
Аватара пользователя
KBEP
Старожил
 
Сообщения: 598
Зарегистрирован: 24 сен 2012, 23:23
Откуда: Калининград, СПб, Северодвинск

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

Сообщение CoreRaySpark 22 окт 2012, 22:05

Вышло то что вышло:
Синтаксис:
Используется 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;


Значения сугубо личные, ибо тестировать надо
Аватара пользователя
CoreRaySpark
UNец
 
Сообщения: 23
Зарегистрирован: 17 окт 2012, 21:54

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

Сообщение AndreyMust19 27 окт 2012, 18:47

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

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

Сообщение CoreRaySpark 27 окт 2012, 20:18

Вот такого подхода я и ждал! Я тоже думал и про скорость и про вес анимации. Знаю как это организовать, но вот как измерить относительное ускорение, так и не допер(
Аватара пользователя
CoreRaySpark
UNец
 
Сообщения: 23
Зарегистрирован: 17 окт 2012, 21:54

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

Сообщение AndreyMust19 27 окт 2012, 21:01

как измерить относительное ускорение, так и не допер(

Очень просто - умножаем controller.velocity на transform.rotation. В результате вектор поворачивается в локальную систему координат (поскольку transform.rotation - это и есть ориентация системы координат объекта относительно глобальной системы координат. Приведенный способ верен, если у персонажа нет родительского объекта, в противном случае исп-ся отдельная функция transform.InverseTransformPoint(Vector3).
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

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

Сообщение CoreRaySpark 27 окт 2012, 21:51

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


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 25