所以我有一个加速度传感器,可以提供加速度数据。设备当前停在某个位置,因此数据如下所示(每个轴都有一些噪音):
ACCELX = 264
ACCELY = -43
ACCELZ = 964
然后是一个代表设备的 3D 模型,“我想要的”就是这个 3D 模型来表示真实设备的方向。在我试图了解.NET中四元数的用法时,这是我狼吞虎咽的代码:
/* globals */
Vector3D PrevVector = new Vector3D(0, 0, 0);
ModelVisual3D model; // initialized and model file loaded
private async void TimerEvent()
{
RotateTransform3D rot = new RotateTransform3D();
QuaternionRotation3D q = new QuaternionRotation3D();
double x = 0, y = 0, z = 0;
List<Reading> results = await Device.ReadSensor();
foreach (Reading r in results)
{
switch (r.Type)
{
case "RPF_SEN_ACCELX":
x = r.Value;
break;
case "RPF_SEN_ACCELY":
y = r.Value;
break;
case "RPF_SEN_ACCELZ":
z = r.Value;
break;
}
}
double angle = Vector3D.AngleBetween(new Vector3D(x, y, z), PrevVector);
q.Quaternion = new Quaternion(new Vector3D(x, y, z), angle);
rot.Rotation = q;
model.Transform = rot;
PrevVector = new Vector3D(x, y, z);
}
移动我的真实设备确实会导致报告值发生变化,但屏幕上的模型只是在我看来随机的方向上抽搐,与噪音相差无几,似乎与我如何旋转真实设备无关。我很确定我正在错误地构建和使用四元数。我该怎么做才对?
这是带有 WPF 的 .NET。还有HelixToolkit.WPF可用,但我还没有看到任何从那里的加速度数据创建四元数的函数。更高级别的框架(例如 Unreal Engine 或 Unity)不适用于此项目。
DIEA
沧海一幻觉
相关分类