2 回答

TA貢獻1820條經(jīng)驗 獲得超3個贊
事實證明我的問題具有完全不同的性質(zhì):我必須使用一個名為Transform3DGroup. 這是必須更改代碼以啟用繞 Z 軸旋轉(zhuǎn)的方式:
/* 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!
}
}
我還沒有找到任何關(guān)于強制使用Transform3DGroup.
為了完整起見,以下是Bill Wallis 在 Math Overflow 上GetAngle()得出的內(nèi)部結(jié)構(gòu):
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 類型的擴展以在弧度和度數(shù)之間轉(zhuǎn)換雙精度數(shù)(類外,命名空間內(nèi)):
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條經(jīng)驗 獲得超5個贊
您的傳感器輸出旋轉(zhuǎn)值是累積的還是差異的?有時輸出旋轉(zhuǎn)是差異,您需要先前的旋轉(zhuǎn)值加上差異來計算當(dāng)前的新旋轉(zhuǎn)值。
您可以嘗試保存之前的四元數(shù)并將當(dāng)前四元數(shù)與之前的四元數(shù)相加,以獲得新的累積旋轉(zhuǎn)。
- 2 回答
- 0 關(guān)注
- 299 瀏覽
添加回答
舉報