【问题标题】:How to convert JavaScript(UnityScript) to C# and implement a low pass filter?如何将 JavaScript(UnityScript) 转换为 C# 并实现低通滤波器?
【发布时间】:2014-12-31 08:04:22
【问题描述】:

我一直在尝试将在 Unity 手册中找到的低通滤波器代码示例应用到我的游戏中,但我遇到了一些问题。

这是 Unity 手册中的原始 JavaScript 示例:

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;
}

这是我对 C# 的转换:

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' 表达式来输入`float'

【问题讨论】:

  • 我认为错误信息很清楚。你读过它们吗?显然,参数类型是您使用的 Lerp 方法之一错误。对于第二个,您尝试将Vector3 类型转换为float,这似乎是不可能的。
  • 它说 Mathf.Lerp 只接受浮点参数.. 但是为什么 Unity 手册中的示例会使用 Vector3 的?

标签: javascript c# unityscript lowpass-filter


【解决方案1】:

示例代码可能有误。请改用Vector3.Lerp()。 Lerps 的完整列表是here

【讨论】:

    【解决方案2】:

    错误信息告诉你所有你需要知道的。查看UnityEngine.Mathf.Lerp(float, float, float)的签名

    您传递给它的参数之一不是float

    【讨论】:

    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多