Как преобразовать JavaScript (UnityScript) в C # и реализовать фильтр нижних частот?

Я пытался внедрить образец кода фильтра нижних частот, который я нашел в руководстве Unity, в свою игру, но у меня возникли некоторые проблемы.

Вот исходный пример JavaScript из руководства Unity:

var AccelerometerUpdateInterval : float = 1.0 / 60.0;
var LowPassKernelWidthInSeconds : float = 1.0;

private var LowPassFilterFactor : float = AccelerometerUpdateInterval /    LowPassKernelWidthInSeconds; // tweakable
private var lowPassValue : Vector3 = Vector3.zero;

function Start () 
{
    lowPassValue = Input.acceleration;
}

function LowPassFilterAccelerometer() : Vector3 
{
    lowPassValue = Mathf.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor);
    return lowPassValue;
}

Вот мое преобразование в С#:

float AccelerometerUpdateInterval = 1.0f / 60.0f;
float LowPassKernelWidthInSeconds = 1.0f;

private float LowPassFilterFactor = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds; // tweakable
private Vector3 lowPassValue = Vector3.zero;

void  Start ()
{
    lowPassValue = Input.acceleration;
}

Vector3 LowPassFilterAccelerometer ()
{
    lowPassValue = Mathf.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor);
    return lowPassValue;
}

Мой исходный код для перемещения моего персонажа с помощью акселерометра был таким (без фильтра нижних частот):

float speed = 30.0f;
Vector2 dir;
private float accel;

void Start () 
{
    accel = Input.acceleration.x;
}

// Update is called once per frame
void Update () 
{  
    accel = Mathf.MoveTowards (accel, Input.acceleration.x, speed * Time.deltaTime);
    dir = new Vector3(accel, 0);

    // move the object at the velocity defined in speed:
    transform.Translate(dir * speed * Time.deltaTime, 0);
}

Это моя попытка реализовать фильтр нижних частот, чтобы уменьшить шум/рывки:

float AccelerometerUpdateInterval = 1.0f / 60.0f;
float LowPassKernelWidthInSeconds = 1.0f;

private float LowPassFilterFactor;
private Vector3 lowPassValue = Vector3.zero;

public float speed = 30.0f;

void Start () 
{
    lowPassValue = Input.acceleration;
    LowPassFilterFactor = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds; 
}

Vector3 LowPassFilterAccelerometer() 
{
    lowPassValue = Mathf.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor);
    return lowPassValue;
}

// Update is called once per frame
void Update () 
{  
    // move the object at the velocity defined in speed:
    transform.Translate(LowPassFilterAccelerometer() * speed * Time.deltaTime, 0);
}

Я получаю некоторые ошибки, когда пытаюсь скомпилировать скрипт:

ошибка CS1502: лучшее соответствие перегруженного метода для UnityEngine.Mathf.Lerp(float, float, float) имеет недопустимые аргументы

ошибка CS1503: Аргумент выражения #1' cannot convertUnityEngine.Vector3 для ввода "плавающего"


person LooMeenin    schedule 31.12.2014    source источник
comment
Я думаю, что сообщения об ошибках понятны. Вы когда-нибудь читали их? Очевидно, что типы параметров неверны для одного из Lerp методов, которые вы использовали. Во втором случае вы пытаетесь привести тип Vector3 к типу float, что кажется невозможным.   -  person Soner Gönül    schedule 31.12.2014
comment
В нем говорится, что Mathf.Lerp принимает только аргументы с плавающей запятой ... но почему образец из руководства Unity использует Vector3?   -  person LooMeenin    schedule 31.12.2014


Ответы (2)


Код примера может быть неправильным. Вместо этого используйте Vector3.Lerp(). Полный список Lerps находится здесь.

person dbc    schedule 31.12.2014

Сообщение об ошибке сообщает вам все, что вам нужно знать. Посмотрите на подпись для UnityEngine.Mathf.Lerp(float, float, float)

Один из параметров, которые вы ему передаете, не является float.

person Cerbrus    schedule 31.12.2014
comment
Да, я это понимаю, но зачем в руководстве использовать Vector3? docs.unity3d.com/Manual/MobileInput.html - person LooMeenin; 31.12.2014
comment
@LooMeenin - Может быть, пример в документации неверен? Также есть Vector3.Lerp. Подробнее здесь. - person dbc; 31.12.2014
comment
@dbc: Это вполне возможно, да. - person Cerbrus; 31.12.2014