彻底修复欧拉角万向锁问题

修改欧拉角为四元数,彻底修复欧拉角在某些角度方向无法达到的问题
main
SuGar-456 2 weeks ago
parent 67ab851411
commit 99fc71988d
  1. 23
      Assets/HandDriver/Scripts/HandDriver.cs

@ -2,7 +2,7 @@ using NaughtyAttributes;
using System.Collections.Generic; using System.Collections.Generic;
using TouchSocket.Core; using TouchSocket.Core;
using UnityEngine; using UnityEngine;
//IMU UNITY统一位姿版 2025/12/15 4574验证 //IMU UNITY彻底修复版 2026/3/3更新
public class HandDriver : MonoBehaviour public class HandDriver : MonoBehaviour
{ {
@ -448,26 +448,15 @@ public class HandDriver : MonoBehaviour
} }
} }
private Quaternion ConvertQuaternion(Quaternion quat, bool isRightHand) private Quaternion ConvertQuaternion(Quaternion q, bool isRightHand)
{ {
// IMU→Unity 坐标轴映射,直接重映射四元数分量
// 左手: IMU(X,Y,Z) → Unity(-Y, Z, X) 右手: IMU(X,Y,Z) → Unity(-Y, -Z, -X)
Quaternion q = new Quaternion(quat.x, quat.y, quat.z, quat.w);
Vector3 e = q.eulerAngles;
// Euler(z, -x, y)
Quaternion result = Quaternion.Euler(e.z, -e.x, e.y);
if (isRightHand) if (isRightHand)
{ {
result = Quaternion.Euler(-e.z , -e.x , -e.y ); return new Quaternion(-q.z, -q.x, -q.y, q.w);
} }
return new Quaternion(q.z, -q.x, q.y, q.w);
return result;
/*
Quaternion quat_r = new Quaternion(quat.x, quat.y, quat.z, quat.w);
quat_r = Quaternion.Euler(quat_r.eulerAngles.z, -quat_r.eulerAngles.x, quat_r.eulerAngles.y);
return quat_r;
*/
} }
private void UpdateThumb() private void UpdateThumb()

Loading…
Cancel
Save