2 回答
TA贡献1820条经验 获得超2个赞
事实证明我的问题具有完全不同的性质:我必须使用一个名为Transform3DGroup. 这是必须更改代码以启用绕 Z 轴旋转的方式:
/* globals */
ModelVisual3D model; // initialized and model file loaded
Transform3DGroup tg = new Transform3DGroup();
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;
angle = GetAngle(x, y).ToDegrees();
q.Quaternion = new Quaternion(new Vector3D(0, 0, 1), angle);
break;
}
rot.Rotation = q;
tg.Children.Clear();
tg.Children.Add(rot);
model.Transform = tg; // Use Transform3DGroup!
}
}
我还没有找到任何关于强制使用Transform3DGroup.
为了完整起见,以下是Bill Wallis 在 Math Overflow 上GetAngle()得出的内部结构:
private double GetAngle(double x, double y)
{
if (x > 0)
{
return 2 * Math.PI - Math.Atan(y / x);
}
else if (x < 0)
{
return Math.PI - Math.Atan(y / x);
}
else // x == 0
{
return 2 * Math.PI - Math.Sign(y) * Math.PI / 2;
}
}
以及 double 类型的扩展以在弧度和度数之间转换双精度数(类外,命名空间内):
public static class NumericExtensions
{
public static double ToRadians(this double val)
{
return (Math.PI / 180) * val;
}
public static double ToDegrees(this double val)
{
return (180 / Math.PI) * val;
}
}
TA贡献1824条经验 获得超5个赞
您的传感器输出旋转值是累积的还是差异的?有时输出旋转是差异,您需要先前的旋转值加上差异来计算当前的新旋转值。
您可以尝试保存之前的四元数并将当前四元数与之前的四元数相加,以获得新的累积旋转。
- 2 回答
- 0 关注
- 247 浏览
添加回答
举报