Я пытался внедрить образец кода фильтра нижних частот, который я нашел в руководстве 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 convert
UnityEngine.Vector3 для ввода "плавающего"
Lerp
методов, которые вы использовали. Во втором случае вы пытаетесь привести типVector3
к типуfloat
, что кажется невозможным. - person Soner Gönül   schedule 31.12.2014