update
parent
41e356aa79
commit
5a0445f150
|
@ -16,8 +16,6 @@ public class GameManager : MonoBehaviour
|
||||||
public bool isTestInput = false;
|
public bool isTestInput = false;
|
||||||
float angleX, angleY, angleZ;
|
float angleX, angleY, angleZ;
|
||||||
|
|
||||||
public float smoothValue = 100;
|
|
||||||
|
|
||||||
public void Awake()
|
public void Awake()
|
||||||
{
|
{
|
||||||
SampleMessageListener.OnReceivedMSG += OnReceivedMessage;
|
SampleMessageListener.OnReceivedMSG += OnReceivedMessage;
|
||||||
|
@ -61,8 +59,8 @@ public class GameManager : MonoBehaviour
|
||||||
if (isCanControlModel)
|
if (isCanControlModel)
|
||||||
{
|
{
|
||||||
//ControlModelRotate(new Vector3(filteredRoll, filteredPitch, angleZ)); // 传入过滤后的值
|
//ControlModelRotate(new Vector3(filteredRoll, filteredPitch, angleZ)); // 传入过滤后的值
|
||||||
var result = CalculateRotation(brainTrans.rotation, ax, ay, az, gx, gy, gz);
|
//brainTrans.rotation = CalculateRotation(brainTrans.rotation, ax, ay, az, gx, gy, gz);
|
||||||
brainTrans.rotation = Quaternion.Slerp(brainTrans.rotation, result, Time.deltaTime * smoothValue);
|
CalculateRotation(ax, ay, az, gx, gy, gz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,6 +78,26 @@ public class GameManager : MonoBehaviour
|
||||||
{
|
{
|
||||||
brainTrans.rotation = Quaternion.Euler(angleModify);
|
brainTrans.rotation = Quaternion.Euler(angleModify);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CalculateRotation(float ax, float ay, float az, float gx, float gy, float gz)
|
||||||
|
{
|
||||||
|
// 通过加速度计算姿态(俯仰角和滚转角)
|
||||||
|
float roll = Mathf.Atan2(ay, az) * Mathf.Rad2Deg; // 滚转角
|
||||||
|
float pitch = Mathf.Atan2(-ax, Mathf.Sqrt(ay * ay + az * az)) * Mathf.Rad2Deg; // 俯仰角
|
||||||
|
|
||||||
|
// 计算角速度的变化(可以设定角速度的阈值或限制其过快变化)
|
||||||
|
angleX += gx * dt; // 绕X轴旋转
|
||||||
|
angleY += gy * dt; // 绕Y轴旋转
|
||||||
|
angleZ += gz * dt; // 绕Z轴旋转
|
||||||
|
|
||||||
|
// 使用互补滤波来平滑姿态估计
|
||||||
|
// 这里的系数决定了加速度和陀螺仪的权重,通常设置为0.98
|
||||||
|
float alpha = 0.98f; // 互补滤波的权重
|
||||||
|
float filteredPitch = alpha * (angleX) + (1 - alpha) * pitch; // 过滤后的俯仰角
|
||||||
|
float filteredRoll = alpha * (angleY) + (1 - alpha) * roll; // 过滤后的滚转角
|
||||||
|
brainTrans.rotation = Quaternion.Euler(new Vector3(filteredRoll, filteredPitch, angleZ));
|
||||||
|
}
|
||||||
|
|
||||||
private Quaternion CalculateRotation(Quaternion rotation, float ax, float ay, float az, float gx, float gy, float gz)
|
private Quaternion CalculateRotation(Quaternion rotation, float ax, float ay, float az, float gx, float gy, float gz)
|
||||||
{
|
{
|
||||||
// 假设你已经有初始四元数
|
// 假设你已经有初始四元数
|
||||||
|
|
Loading…
Reference in New Issue