我目前正在处理一个JSON文件夹,这些文件是通过无人机跟踪实验收集的。数据包含无人机在跟踪系统中移动和悬浮时的位置,旋转和时间戳。我目前正在做的是尝试使用这些数据在Unity中模拟无人机的移动。到目前为止,我已经成功地解析了Unity中对象的位置和旋转,并将时间戳提取到Unity中的System.DateTime。但是,我不知道如何使用时间戳。我想使用时间戳来匹配对象的位置和旋转(即:在这个时间戳,无人机应该在这个位置(x,y,z)并且具有旋转(x,y,z,w)).有人能帮助我解决这个问题吗,真的很感谢你的帮助:D这是我现在的代码:
void Update()
{
if (loaded)
{
for(int i = 0; i <= pos_data.Count; i+= 10)
{
Cube.transform.position = pos_data[i];
Cube.transform.rotation = rot_data[i];
}
}
else
{
LoadJson();
//startTime = datetime[0];
loaded = true;
}
}
public void LoadJson()
{
string HeadPath = @Application.dataPath + "/Data/" + "drone_data_1.json";
string HeadJsonhold = File.ReadAllText(HeadPath);
var data_ = JSON.Parse(HeadJsonhold);
for (int rows = 0; rows <= data_.Count; rows += 10)
{
pos_data.Add(new Vector3(data_[rows]["location"]["x"].AsFloat, data_[rows]["location"]["y"].AsFloat, data_[rows]["location"]["z"].AsFloat));
rot_data.Add(new Quaternion(data_[rows]["rotation"]["x"].AsFloat, data_[rows]["rotation"]["y"].AsFloat, data_[rows]["rotation"]["z"].AsFloat, data_[rows]["rotation"]["w"].AsFloat));
Time = System.DateTime.ParseExact(data_[rows]["Timestamp"], "yyyyMMddHHmmss",null);
//Debug.Log(Time);
}
}
1条答案
按热度按时间nfzehxib1#
如果我没理解错的话,你得到的是真实世界无人机的样本,它以一定的速度存储了它运动的关键帧。
现在您已经成功加载了json数据,但不知道如何相应地为Unity对象设置动画。
时间戳本身你根本不能使用!^^
它很可能就在过去的某个地方;你不能只给
Time
赋值。但是,您可以做的是获取第一个样本的时间戳(我假设您的样本都已经按时间排序),并计算与下一个样本的差异,依此类推。
然后,您可以使用该差异,以便始终使用给定的时间增量在当前和下一个采样变换之间进行插值。
目前你只是在一个帧中完成所有采样**,所以根本不会有任何动画。
也正如sidenote:
错了两次:
0
的,所以最后可访问的索引将是pos_data.Count - 1
,因此通常当迭代列表/数组时,它应该是i < pos_data.Count
;)**更新:**关于插值的更好解决方案,请参考this newer post-下面的数据类型可以进行调整,以更好地适应其中提到的
AnimationCurve
方法。首先,我建议你使用一个更好的数据结构,使用一个单独的列表来保存属于一起的信息,而不是多个并行列表,而是像这样加载你的json。
然后呢
那么现在如何处理这些信息?
现在,您有样本(仍然假设按时间排序),其中包含所有所需的信息,以便能够在它们之间进行插值。
我会使用Coroutines而不是
Update
,在我看来,它们更容易理解和维护