今天搜索处理陀螺仪抖动问题方法时,看见有人使用Queue,顺便研究了一下。
//用平均值的方法平滑陀螺仪曲线,实现思想简单描述如下
Queue<Quaternion> averageList;
averageList.Enqueue (Input.gyro.attitude);
if (averageList.Count > 240)
averageList.Dequeue ();
foreach (Quaternion singleRotation in averageList)
{
//分离,重组Quaternion,获得平均值averageRotation
}
//通过插值贴回给摄像头
transform.localRotation = Quaternion.Slerp(transform.localRotation, averageRotation, Time.deltaTime* 4f);
Queue的基本功能有插入、提取和检查操作。可以用来如排队,计时等线性相关的问题。
相关API可以参考MSDN,下面通过例子熟悉一下Unity中Queue相关的操作。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class QueueExample : MonoBehaviour
{
public Queue queue;
public Text queueCount;
public Text queueContent;
public Text queuePeek;
void Start()
{
queue = new Queue();
}
void Update()
{
if (queue.Count > 0)
{
queuePeek.text = "queuePeek : " + queue.Peek().ToString();
}
else
{
queuePeek.text = "queuePeek : ";
}
//增加元素
if (Input.GetKeyDown(KeyCode.A))
{
InsetTime();
showQueue();
}
//减去元素
if (Input.GetKeyDown(KeyCode.D))
{
if (queue.Count > 0)
{
Debug.Log(queue.Dequeue());
showQueue();
}
}
//清除队列所有元素
if (Input.GetKeyDown(KeyCode.C))
{
queue.Clear();
showQueue();
}
queueCount.text = "queueCount : " + queue.Count.ToString();
}
void InsetTime()
{
queue.Enqueue(Time.time);
}
void showQueue()
{
queueContent.text = "queueContent : ";
foreach (float value in queue)
{
queueContent.text += value.ToString() + " | ";
}
}
}
通过插入,提取,检查,清除等操作了解queue的运行,结果如图。