You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
698 lines
24 KiB
698 lines
24 KiB
|
3 months ago
|
using NaughtyAttributes;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using TouchSocket.Core;
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
public class HandDriver : MonoBehaviour
|
||
|
|
{
|
||
|
|
public Network Network;
|
||
|
|
|
||
|
|
public enum HandType
|
||
|
|
{
|
||
|
|
Left,
|
||
|
|
Right
|
||
|
|
}
|
||
|
|
|
||
|
|
public enum Axis
|
||
|
|
{
|
||
|
|
x,
|
||
|
|
y,
|
||
|
|
z,
|
||
|
|
x_n,
|
||
|
|
y_n,
|
||
|
|
z_n
|
||
|
|
}
|
||
|
|
|
||
|
|
public string CharacterName = string.Empty;
|
||
|
|
public HandType Hand;
|
||
|
|
private Dictionary<string, Quaternion> _originQuaternionDic;
|
||
|
|
|
||
|
|
public Transform Thumb1;
|
||
|
|
public Transform Thumb2;
|
||
|
|
public Transform Thumb3;
|
||
|
|
|
||
|
|
public Transform Index1;
|
||
|
|
public Transform Index2;
|
||
|
|
public Transform Index3;
|
||
|
|
|
||
|
|
public Transform Middle1;
|
||
|
|
public Transform Middle2;
|
||
|
|
public Transform Middle3;
|
||
|
|
|
||
|
|
public Transform Ring1;
|
||
|
|
public Transform Ring2;
|
||
|
|
public Transform Ring3;
|
||
|
|
|
||
|
|
public Transform Pinky1;
|
||
|
|
public Transform Pinky2;
|
||
|
|
public Transform Pinky3;
|
||
|
|
|
||
|
|
public Transform Wrist;
|
||
|
|
|
||
|
|
[Header("[Axis OffSet]")]
|
||
|
|
public Axis Pitch = Axis.x;
|
||
|
|
|
||
|
|
public Axis Roll = Axis.y;
|
||
|
|
|
||
|
|
public Axis Yaw = Axis.z;
|
||
|
|
|
||
|
|
[Header("[IMU(On/Off)]")] public bool HasIMU = false;
|
||
|
|
|
||
|
|
[Header("[Thumb Root Coefficient]")] [Range(0, 1)] public float coefficient = 0.6f;
|
||
|
|
|
||
|
|
[Header("[Thumb Root OffSet]")] public Vector3 Thumb1Offset;
|
||
|
|
|
||
|
|
[Header("[App Options]")]
|
||
|
|
public bool NeedRealTransfrom;
|
||
|
|
|
||
|
|
//[HideInInspector]
|
||
|
|
public bool UsingNetwork;
|
||
|
|
|
||
|
|
public bool UsingAndroidService;
|
||
|
|
|
||
|
|
[Header("[Vector3 Angles]")]
|
||
|
|
public Vector3 thumb1;
|
||
|
|
public Vector3 thumb2;
|
||
|
|
public Vector3 thumb3;
|
||
|
|
|
||
|
|
public Vector3 index1;
|
||
|
|
public Vector3 index2;
|
||
|
|
public Vector3 index3;
|
||
|
|
|
||
|
|
public Vector3 middle1;
|
||
|
|
public Vector3 middle2;
|
||
|
|
public Vector3 middle3;
|
||
|
|
|
||
|
|
public Vector3 ring1;
|
||
|
|
public Vector3 ring2;
|
||
|
|
public Vector3 ring3;
|
||
|
|
|
||
|
|
public Vector3 pinky1;
|
||
|
|
public Vector3 pinky2;
|
||
|
|
public Vector3 pinky3;
|
||
|
|
|
||
|
|
[Header("[Controller Values]")]
|
||
|
|
public float Joy_X;
|
||
|
|
public float Joy_Y;
|
||
|
|
public bool Button_A;
|
||
|
|
public bool Button_B;
|
||
|
|
public bool Button_Joystick;
|
||
|
|
public bool Button_Menu;
|
||
|
|
public InputData inputData = new();
|
||
|
|
|
||
|
|
[Header("[Vibration Control]")]
|
||
|
|
public string SendBackIP;
|
||
|
|
public VibrationData vibrationData;
|
||
|
|
|
||
|
|
[BoxGroup("Vibrator 1"), Min(0), Label("Million Second")]
|
||
|
|
public int Duration1 = 20;
|
||
|
|
[BoxGroup("Vibrator 1"), Range(4, 10)]
|
||
|
|
public int Amplitude1 = 4;
|
||
|
|
[Button]
|
||
|
|
public void Vibrator_1Active()
|
||
|
|
{
|
||
|
|
if (Network == null) return;
|
||
|
|
SingleVirbator[] Virbators;
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(1, Duration1, Amplitude1),
|
||
|
|
new SingleVirbator()
|
||
|
|
};
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(),
|
||
|
|
new SingleVirbator(1, Duration1, Amplitude1),
|
||
|
|
};
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
}
|
||
|
|
Network.SendVibrationMsg(CharacterName, SendBackIP, vibrationData);
|
||
|
|
}
|
||
|
|
|
||
|
|
[BoxGroup("Vibrator 2"), Min(0), Label("Million Second")]
|
||
|
|
public int Duration2 = 20;
|
||
|
|
[BoxGroup("Vibrator 2"), Range(4, 10)]
|
||
|
|
public int Amplitude2 = 4;
|
||
|
|
[Button]
|
||
|
|
public void Vibrator_2Active()
|
||
|
|
{
|
||
|
|
if (Network == null) return;
|
||
|
|
SingleVirbator[] Virbators;
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(2, Duration2, Amplitude2),
|
||
|
|
new SingleVirbator()
|
||
|
|
};
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(),
|
||
|
|
new SingleVirbator(2, Duration2, Amplitude2),
|
||
|
|
};
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
}
|
||
|
|
Network.SendVibrationMsg(CharacterName, SendBackIP, vibrationData);
|
||
|
|
}
|
||
|
|
[Button]
|
||
|
|
public void BothActiveWithVibrator_1Parameters()
|
||
|
|
{
|
||
|
|
if (Network == null) return;
|
||
|
|
SingleVirbator[] Virbators;
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(3, Duration1, Amplitude1),
|
||
|
|
new SingleVirbator()
|
||
|
|
};
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(),
|
||
|
|
new SingleVirbator(3, Duration1, Amplitude1),
|
||
|
|
};
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
}
|
||
|
|
Network.SendVibrationMsg(CharacterName, SendBackIP, vibrationData);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
// Start is called before the first frame update
|
||
|
|
void Start()
|
||
|
|
{
|
||
|
|
if (GameObject.Find("Network") == null && (UsingAndroidService || UsingNetwork))
|
||
|
|
{
|
||
|
|
GameObject network = new GameObject("Network");
|
||
|
|
network.AddComponent<Network>();
|
||
|
|
Network = GameObject.Find("Network").GetComponent<Network>();
|
||
|
|
}
|
||
|
|
else if (UsingAndroidService || UsingNetwork)
|
||
|
|
{
|
||
|
|
Network = GameObject.Find("Network").GetComponent<Network>();
|
||
|
|
}
|
||
|
|
|
||
|
|
_originQuaternionDic = new Dictionary<string, Quaternion>();
|
||
|
|
InitJoints();
|
||
|
|
|
||
|
|
if (string.IsNullOrEmpty(SendBackIP) || UsingAndroidService)
|
||
|
|
{
|
||
|
|
SendBackIP = "127.0.0.1";
|
||
|
|
}
|
||
|
|
|
||
|
|
var Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(0, 0, 1),
|
||
|
|
new SingleVirbator(0, 0, 1)
|
||
|
|
};
|
||
|
|
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
|
||
|
|
if(UsingAndroidService)
|
||
|
|
{
|
||
|
|
CharacterName = "AndroidService";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void InitJoints()
|
||
|
|
{
|
||
|
|
_originQuaternionDic.AddOrUpdate(Thumb1.name, Thumb1.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Thumb2.name, Thumb2.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Thumb3.name, Thumb3.localRotation);
|
||
|
|
|
||
|
|
_originQuaternionDic.AddOrUpdate(Index1.name, Index1.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Index2.name, Index2.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Index3.name, Index3.localRotation);
|
||
|
|
|
||
|
|
_originQuaternionDic.AddOrUpdate(Middle1.name, Middle1.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Middle2.name, Middle2.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Middle3.name, Middle3.localRotation);
|
||
|
|
|
||
|
|
_originQuaternionDic.AddOrUpdate(Ring1.name, Ring1.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Ring2.name, Ring2.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Ring3.name, Ring3.localRotation);
|
||
|
|
|
||
|
|
_originQuaternionDic.AddOrUpdate(Pinky1.name, Pinky1.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Pinky2.name, Pinky2.localRotation);
|
||
|
|
_originQuaternionDic.AddOrUpdate(Pinky3.name, Pinky3.localRotation);
|
||
|
|
|
||
|
|
_originQuaternionDic.AddOrUpdate(Wrist.name, Wrist.localRotation);
|
||
|
|
}
|
||
|
|
|
||
|
|
private void Rotate(Transform tran, float angle, Axis angleType)
|
||
|
|
{
|
||
|
|
if (!NeedRealTransfrom) return;
|
||
|
|
|
||
|
|
float angleX = 0;
|
||
|
|
float angleY = 0;
|
||
|
|
float angleZ = 0;
|
||
|
|
|
||
|
|
switch (angleType)
|
||
|
|
{
|
||
|
|
case Axis.x_n:
|
||
|
|
angleX = -angle;
|
||
|
|
break;
|
||
|
|
case Axis.y_n:
|
||
|
|
angleY = -angle;
|
||
|
|
break;
|
||
|
|
case Axis.z_n:
|
||
|
|
angleZ = -angle;
|
||
|
|
break;
|
||
|
|
case Axis.x:
|
||
|
|
angleX = angle;
|
||
|
|
break;
|
||
|
|
case Axis.y:
|
||
|
|
angleY = angle;
|
||
|
|
break;
|
||
|
|
case Axis.z:
|
||
|
|
angleZ = angle;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
tran.Rotate(angleX, angleY, angleZ);
|
||
|
|
}
|
||
|
|
|
||
|
|
private Vector3 ConvertAngleToVec3(Vector3 current, float angle, Axis angleType)
|
||
|
|
{
|
||
|
|
float angleX = 0;
|
||
|
|
float angleY = 0;
|
||
|
|
float angleZ = 0;
|
||
|
|
|
||
|
|
switch (angleType)
|
||
|
|
{
|
||
|
|
case Axis.x_n:
|
||
|
|
angleX = -angle;
|
||
|
|
break;
|
||
|
|
case Axis.y_n:
|
||
|
|
angleY = -angle;
|
||
|
|
break;
|
||
|
|
case Axis.z_n:
|
||
|
|
angleZ = -angle;
|
||
|
|
break;
|
||
|
|
case Axis.x:
|
||
|
|
angleX = angle;
|
||
|
|
break;
|
||
|
|
case Axis.y:
|
||
|
|
angleY = angle;
|
||
|
|
break;
|
||
|
|
case Axis.z:
|
||
|
|
angleZ = angle;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return current + new Vector3(angleX, angleY, angleZ);
|
||
|
|
}
|
||
|
|
|
||
|
|
private void ResetRotation(Transform trans)
|
||
|
|
{
|
||
|
|
if (_originQuaternionDic.TryGetValue(trans.name, out Quaternion rot))
|
||
|
|
{
|
||
|
|
trans.localRotation = rot;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void GetVec3Value(Vector3[] value)
|
||
|
|
{
|
||
|
|
thumb1 = value[0];
|
||
|
|
thumb2 = value[1];
|
||
|
|
thumb3 = value[2];
|
||
|
|
|
||
|
|
index1 = value[3];
|
||
|
|
index2 = value[4];
|
||
|
|
index3 = value[5];
|
||
|
|
|
||
|
|
middle1 = value[6];
|
||
|
|
middle2 = value[7];
|
||
|
|
middle3 = value[8];
|
||
|
|
|
||
|
|
ring1 = value[9];
|
||
|
|
ring2 = value[10];
|
||
|
|
ring3 = value[11];
|
||
|
|
|
||
|
|
pinky1 = value[12];
|
||
|
|
pinky2 = value[13];
|
||
|
|
pinky3 = value[14];
|
||
|
|
}
|
||
|
|
|
||
|
|
// Update is called once per frame
|
||
|
|
void Update()
|
||
|
|
{
|
||
|
|
if (UsingNetwork || UsingAndroidService)
|
||
|
|
{
|
||
|
|
UpdateThumb();
|
||
|
|
UpdateIndex();
|
||
|
|
UpdateMiddle();
|
||
|
|
UpdateRing();
|
||
|
|
UpdatePinky();
|
||
|
|
|
||
|
|
UpdateWrist();
|
||
|
|
UpdateController();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void UpdateWrist()
|
||
|
|
{
|
||
|
|
if (HasIMU)
|
||
|
|
{
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
Quaternion quat_r = new Quaternion(
|
||
|
|
Network.Convert2Angle(CharacterName, "l26"),//x
|
||
|
|
Network.Convert2Angle(CharacterName, "l25"),//y
|
||
|
|
Network.Convert2Angle(CharacterName, "l27"),//z
|
||
|
|
Network.Convert2Angle(CharacterName, "l24"));//w
|
||
|
|
ResetRotation(Wrist);
|
||
|
|
quat_r = ConvertQuaternion(quat_r);
|
||
|
|
Wrist.rotation = quat_r;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Quaternion quat_r = new Quaternion(Network.Convert2Angle(CharacterName, "r26"),
|
||
|
|
Network.Convert2Angle(CharacterName, "r25"),
|
||
|
|
Network.Convert2Angle(CharacterName, "r27"), Network.Convert2Angle(CharacterName, "r24"));
|
||
|
|
ResetRotation(Wrist);
|
||
|
|
quat_r = ConvertQuaternion(quat_r);
|
||
|
|
Wrist.rotation = quat_r;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void UpdateController()
|
||
|
|
{
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
Joy_X = Network.Convert2Angle(CharacterName, "l_joyX");
|
||
|
|
Joy_Y = Network.Convert2Angle(CharacterName, "l_joyY");
|
||
|
|
Button_A = Network.Convert2Bool(CharacterName, "l_aButton");
|
||
|
|
Button_B = Network.Convert2Bool(CharacterName, "l_bButton");
|
||
|
|
Button_Joystick = Network.Convert2Bool(CharacterName, "l_joyButton");
|
||
|
|
Button_Menu = Network.Convert2Bool(CharacterName, "l_menu");
|
||
|
|
inputData.joyX = Joy_X;
|
||
|
|
inputData.joyY = Joy_Y;
|
||
|
|
inputData.aButton = Button_A;
|
||
|
|
inputData.bButton = Button_B;
|
||
|
|
inputData.joyButton = Button_Joystick;
|
||
|
|
inputData.menu = Button_Menu;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Joy_X = Network.Convert2Angle(CharacterName, "r_joyX");
|
||
|
|
Joy_Y = Network.Convert2Angle(CharacterName, "r_joyY");
|
||
|
|
Button_A = Network.Convert2Bool(CharacterName, "r_aButton");
|
||
|
|
Button_B = Network.Convert2Bool(CharacterName, "r_bButton");
|
||
|
|
Button_Joystick = Network.Convert2Bool(CharacterName, "r_joyButton");
|
||
|
|
Button_Menu = Network.Convert2Bool(CharacterName, "r_menu");
|
||
|
|
inputData.joyX = Joy_X;
|
||
|
|
inputData.joyY = Joy_Y;
|
||
|
|
inputData.aButton = Button_A;
|
||
|
|
inputData.bButton = Button_B;
|
||
|
|
inputData.joyButton = Button_Joystick;
|
||
|
|
inputData.menu = Button_Menu;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//z轴朝上的右手坐标系 四元数 转换为 Y轴朝上的左手坐标系 四元数
|
||
|
|
private Quaternion ConvertQuaternion(Quaternion quat)
|
||
|
|
{
|
||
|
|
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()
|
||
|
|
{
|
||
|
|
if (NeedRealTransfrom)
|
||
|
|
{
|
||
|
|
ResetRotation(Thumb1);
|
||
|
|
ResetRotation(Thumb2);
|
||
|
|
ResetRotation(Thumb3);
|
||
|
|
}
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
var thumb3Pitch = Network.Convert2Angle(CharacterName, "l0");
|
||
|
|
var thumb2Pitch = Network.Convert2Angle(CharacterName, "l1");
|
||
|
|
var thumb1Pitch = Network.Convert2Angle(CharacterName, "l2") * coefficient + Thumb1Offset.y;
|
||
|
|
var thumb1Yaw = Network.Convert2Angle(CharacterName, "l3") + Thumb1Offset.z;
|
||
|
|
var thumb1Roll = Network.Convert2Angle(CharacterName, "l20") + Thumb1Offset.x;
|
||
|
|
|
||
|
|
thumb3 = ConvertAngleToVec3(Vector3.zero, thumb3Pitch, Pitch);
|
||
|
|
thumb2 = ConvertAngleToVec3(Vector3.zero, thumb2Pitch, Pitch);
|
||
|
|
thumb1 = ConvertAngleToVec3(Vector3.zero, thumb1Pitch, Pitch);
|
||
|
|
thumb1 = ConvertAngleToVec3(thumb1, thumb1Yaw, Yaw);
|
||
|
|
thumb1 = ConvertAngleToVec3(thumb1, thumb1Roll, Roll);
|
||
|
|
|
||
|
|
Rotate(Thumb3, thumb3Pitch, Pitch);
|
||
|
|
Rotate(Thumb2, thumb2Pitch, Pitch);
|
||
|
|
Rotate(Thumb1, thumb1Pitch, Pitch);
|
||
|
|
Rotate(Thumb1, thumb1Yaw, Yaw);
|
||
|
|
Rotate(Thumb1, thumb1Roll, Roll);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
|
||
|
|
var thumb3Pitch = Network.Convert2Angle(CharacterName, "r0");
|
||
|
|
var thumb2Pitch = Network.Convert2Angle(CharacterName, "r1");
|
||
|
|
var thumb1Pitch = Network.Convert2Angle(CharacterName, "r2") * coefficient + Thumb1Offset.y;
|
||
|
|
var thumb1Yaw = Network.Convert2Angle(CharacterName, "r3") + Thumb1Offset.z;
|
||
|
|
var thumb1Roll = Network.Convert2Angle(CharacterName, "r20") + Thumb1Offset.x;
|
||
|
|
|
||
|
|
thumb3 = ConvertAngleToVec3(Vector3.zero, thumb3Pitch, Pitch);
|
||
|
|
thumb2 = ConvertAngleToVec3(Vector3.zero, thumb2Pitch, Pitch);
|
||
|
|
thumb1 = ConvertAngleToVec3(Vector3.zero, thumb1Pitch, Pitch);
|
||
|
|
thumb1 = ConvertAngleToVec3(thumb1, thumb1Yaw, Yaw);
|
||
|
|
thumb1 = ConvertAngleToVec3(thumb1, thumb1Roll, Roll);
|
||
|
|
|
||
|
|
Rotate(Thumb3, thumb3Pitch, Pitch);
|
||
|
|
Rotate(Thumb2, thumb2Pitch, Pitch);
|
||
|
|
Rotate(Thumb1, thumb1Pitch, Pitch);
|
||
|
|
Rotate(Thumb1, thumb1Yaw, Yaw);
|
||
|
|
Rotate(Thumb1, thumb1Roll, Roll);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void UpdateIndex()
|
||
|
|
{
|
||
|
|
if (NeedRealTransfrom)
|
||
|
|
{
|
||
|
|
ResetRotation(Index1);
|
||
|
|
ResetRotation(Index2);
|
||
|
|
ResetRotation(Index3);
|
||
|
|
}
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
var index3Pitch = Network.Convert2Angle(CharacterName, "l4");
|
||
|
|
var index2Pitch = Network.Convert2Angle(CharacterName, "l5");
|
||
|
|
var index1Pitch = Network.Convert2Angle(CharacterName, "l6");
|
||
|
|
var index1Yaw = Network.Convert2Angle(CharacterName, "l7");
|
||
|
|
var index1Roll = Network.Convert2Angle(CharacterName, "l21");
|
||
|
|
|
||
|
|
index3 = ConvertAngleToVec3(Vector3.zero, index3Pitch, Pitch);
|
||
|
|
index2 = ConvertAngleToVec3(Vector3.zero, index2Pitch, Pitch);
|
||
|
|
index1 = ConvertAngleToVec3(Vector3.zero, index1Pitch, Pitch);
|
||
|
|
index1 = ConvertAngleToVec3(index1, index1Yaw, Yaw);
|
||
|
|
index1 = ConvertAngleToVec3(index1, index1Roll, Roll);
|
||
|
|
|
||
|
|
Rotate(Index3, index3Pitch, Pitch);
|
||
|
|
Rotate(Index2, index2Pitch, Pitch);
|
||
|
|
Rotate(Index1, index1Pitch, Pitch);
|
||
|
|
Rotate(Index1, index1Yaw, Yaw);
|
||
|
|
Rotate(Index1, index1Roll, Roll);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
var index3Pitch = Network.Convert2Angle(CharacterName, "r4");
|
||
|
|
var index2Pitch = Network.Convert2Angle(CharacterName, "r5");
|
||
|
|
var index1Pitch = Network.Convert2Angle(CharacterName, "r6");
|
||
|
|
var index1Yaw = Network.Convert2Angle(CharacterName, "r7");
|
||
|
|
var index1Roll = Network.Convert2Angle(CharacterName, "r21");
|
||
|
|
|
||
|
|
index3 = ConvertAngleToVec3(Vector3.zero, index3Pitch, Pitch);
|
||
|
|
index2 = ConvertAngleToVec3(Vector3.zero, index2Pitch, Pitch);
|
||
|
|
index1 = ConvertAngleToVec3(Vector3.zero, index1Pitch, Pitch);
|
||
|
|
index1 = ConvertAngleToVec3(index1, index1Yaw, Yaw);
|
||
|
|
index1 = ConvertAngleToVec3(index1, index1Roll, Roll);
|
||
|
|
|
||
|
|
Rotate(Index3, index3Pitch, Pitch);
|
||
|
|
Rotate(Index2, index2Pitch, Pitch);
|
||
|
|
Rotate(Index1, index1Pitch, Pitch);
|
||
|
|
Rotate(Index1, index1Yaw, Yaw);
|
||
|
|
Rotate(Index1, index1Roll, Roll);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void UpdateMiddle()
|
||
|
|
{
|
||
|
|
if (NeedRealTransfrom)
|
||
|
|
{
|
||
|
|
ResetRotation(Middle1);
|
||
|
|
ResetRotation(Middle2);
|
||
|
|
ResetRotation(Middle3);
|
||
|
|
}
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
var middle3Pitch = Network.Convert2Angle(CharacterName, "l8");
|
||
|
|
var middle2Pitch = Network.Convert2Angle(CharacterName, "l9");
|
||
|
|
var middle1Pitch = Network.Convert2Angle(CharacterName, "l10");
|
||
|
|
var middle1Yaw = Network.Convert2Angle(CharacterName, "l11");
|
||
|
|
|
||
|
|
middle3 = ConvertAngleToVec3(Vector3.zero, middle3Pitch, Pitch);
|
||
|
|
middle2 = ConvertAngleToVec3(Vector3.zero, middle2Pitch, Pitch);
|
||
|
|
middle1 = ConvertAngleToVec3(Vector3.zero, middle1Pitch, Pitch);
|
||
|
|
middle1 = ConvertAngleToVec3(middle1, middle1Yaw, Yaw);
|
||
|
|
|
||
|
|
Rotate(Middle3, middle3Pitch, Pitch);
|
||
|
|
Rotate(Middle2, middle2Pitch, Pitch);
|
||
|
|
Rotate(Middle1, middle1Pitch, Pitch);
|
||
|
|
Rotate(Middle1, middle1Yaw, Yaw);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
var middle3Pitch = Network.Convert2Angle(CharacterName, "r8");
|
||
|
|
var middle2Pitch = Network.Convert2Angle(CharacterName, "r9");
|
||
|
|
var middle1Pitch = Network.Convert2Angle(CharacterName, "r10");
|
||
|
|
var middle1Yaw = Network.Convert2Angle(CharacterName, "r11");
|
||
|
|
|
||
|
|
middle3 = ConvertAngleToVec3(Vector3.zero, middle3Pitch, Pitch);
|
||
|
|
middle2 = ConvertAngleToVec3(Vector3.zero, middle2Pitch, Pitch);
|
||
|
|
middle1 = ConvertAngleToVec3(Vector3.zero, middle1Pitch, Pitch);
|
||
|
|
middle1 = ConvertAngleToVec3(middle1, middle1Yaw, Yaw);
|
||
|
|
|
||
|
|
Rotate(Middle3, middle3Pitch, Pitch);
|
||
|
|
Rotate(Middle2, middle2Pitch, Pitch);
|
||
|
|
Rotate(Middle1, middle1Pitch, Pitch);
|
||
|
|
Rotate(Middle1, middle1Yaw, Yaw);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void UpdateRing()
|
||
|
|
{
|
||
|
|
if (NeedRealTransfrom)
|
||
|
|
{
|
||
|
|
ResetRotation(Ring1);
|
||
|
|
ResetRotation(Ring2);
|
||
|
|
ResetRotation(Ring3);
|
||
|
|
}
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
var ring3Pitch = Network.Convert2Angle(CharacterName, "l12");
|
||
|
|
var ring2Pitch = Network.Convert2Angle(CharacterName, "l13");
|
||
|
|
var ring1Pitch = Network.Convert2Angle(CharacterName, "l14");
|
||
|
|
var ring1Yaw = Network.Convert2Angle(CharacterName, "l15");
|
||
|
|
|
||
|
|
ring3 = ConvertAngleToVec3(Vector3.zero, ring3Pitch, Pitch);
|
||
|
|
ring2 = ConvertAngleToVec3(Vector3.zero, ring2Pitch, Pitch);
|
||
|
|
ring1 = ConvertAngleToVec3(Vector3.zero, ring1Pitch, Pitch);
|
||
|
|
ring1 = ConvertAngleToVec3(ring1, ring1Yaw, Yaw);
|
||
|
|
|
||
|
|
Rotate(Ring3, ring3Pitch, Pitch);
|
||
|
|
Rotate(Ring2, ring2Pitch, Pitch);
|
||
|
|
Rotate(Ring1, ring1Pitch, Pitch);
|
||
|
|
Rotate(Ring1, ring1Yaw, Yaw);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
var ring3Pitch = Network.Convert2Angle(CharacterName, "r12");
|
||
|
|
var ring2Pitch = Network.Convert2Angle(CharacterName, "r13");
|
||
|
|
var ring1Pitch = Network.Convert2Angle(CharacterName, "r14");
|
||
|
|
var ring1Yaw = Network.Convert2Angle(CharacterName, "r15");
|
||
|
|
|
||
|
|
ring3 = ConvertAngleToVec3(Vector3.zero, ring3Pitch, Pitch);
|
||
|
|
ring2 = ConvertAngleToVec3(Vector3.zero, ring2Pitch, Pitch);
|
||
|
|
ring1 = ConvertAngleToVec3(Vector3.zero, ring1Pitch, Pitch);
|
||
|
|
ring1 = ConvertAngleToVec3(ring1, ring1Yaw, Yaw);
|
||
|
|
|
||
|
|
Rotate(Ring3, ring3Pitch, Pitch);
|
||
|
|
Rotate(Ring2, ring2Pitch, Pitch);
|
||
|
|
Rotate(Ring1, ring1Pitch, Pitch);
|
||
|
|
Rotate(Ring1, ring1Yaw, Yaw);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void UpdatePinky()
|
||
|
|
{
|
||
|
|
if (NeedRealTransfrom)
|
||
|
|
{
|
||
|
|
ResetRotation(Pinky1);
|
||
|
|
ResetRotation(Pinky2);
|
||
|
|
ResetRotation(Pinky3);
|
||
|
|
}
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
var pinky3Pitch = Network.Convert2Angle(CharacterName, "l16");
|
||
|
|
var pinky2Pitch = Network.Convert2Angle(CharacterName, "l17");
|
||
|
|
var pinky1Pitch = Network.Convert2Angle(CharacterName, "l18");
|
||
|
|
var pinky1Yaw = Network.Convert2Angle(CharacterName, "l19");
|
||
|
|
var pinky1Roll = Network.Convert2Angle(CharacterName, "l22");
|
||
|
|
|
||
|
|
pinky3 = ConvertAngleToVec3(Vector3.zero, pinky3Pitch, Pitch);
|
||
|
|
pinky2 = ConvertAngleToVec3(Vector3.zero, pinky2Pitch, Pitch);
|
||
|
|
pinky1 = ConvertAngleToVec3(Vector3.zero, pinky1Pitch, Pitch);
|
||
|
|
pinky1 = ConvertAngleToVec3(pinky1, pinky1Yaw, Yaw);
|
||
|
|
pinky1 = ConvertAngleToVec3(pinky1, pinky1Roll, Roll);
|
||
|
|
|
||
|
|
Rotate(Pinky3, pinky3Pitch, Pitch);
|
||
|
|
Rotate(Pinky2, pinky2Pitch, Pitch);
|
||
|
|
Rotate(Pinky1, pinky1Pitch, Pitch);
|
||
|
|
Rotate(Pinky1, pinky1Yaw, Yaw);
|
||
|
|
Rotate(Pinky1, pinky1Roll, Roll);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
var pinky3Pitch = Network.Convert2Angle(CharacterName, "r16");
|
||
|
|
var pinky2Pitch = Network.Convert2Angle(CharacterName, "r17");
|
||
|
|
var pinky1Pitch = Network.Convert2Angle(CharacterName, "r18");
|
||
|
|
var pinky1Yaw = Network.Convert2Angle(CharacterName, "r19");
|
||
|
|
var pinky1Roll = Network.Convert2Angle(CharacterName, "r22");
|
||
|
|
|
||
|
|
pinky3 = ConvertAngleToVec3(Vector3.zero, pinky3Pitch, Pitch);
|
||
|
|
pinky2 = ConvertAngleToVec3(Vector3.zero, pinky2Pitch, Pitch);
|
||
|
|
pinky1 = ConvertAngleToVec3(Vector3.zero, pinky1Pitch, Pitch);
|
||
|
|
pinky1 = ConvertAngleToVec3(pinky1, pinky1Yaw, Yaw);
|
||
|
|
pinky1 = ConvertAngleToVec3(pinky1, pinky1Roll, Roll);
|
||
|
|
|
||
|
|
Rotate(Pinky3, pinky3Pitch, Pitch);
|
||
|
|
Rotate(Pinky2, pinky2Pitch, Pitch);
|
||
|
|
Rotate(Pinky1, pinky1Pitch, Pitch);
|
||
|
|
Rotate(Pinky1, pinky1Yaw, Yaw);
|
||
|
|
Rotate(Pinky1, pinky1Roll, Roll);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public void ServiceVibrationControl(int VirbatorIndex = 1, int DurationSecond = 20, int Strength = 10)
|
||
|
|
{
|
||
|
|
if (Network == null || !UsingAndroidService) return;
|
||
|
|
|
||
|
|
SingleVirbator[] Virbators;
|
||
|
|
if (Hand == HandType.Left)
|
||
|
|
{
|
||
|
|
Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(VirbatorIndex, DurationSecond, Strength),
|
||
|
|
new SingleVirbator()
|
||
|
|
};
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Virbators = new SingleVirbator[2]
|
||
|
|
{
|
||
|
|
new SingleVirbator(),
|
||
|
|
new SingleVirbator(VirbatorIndex, DurationSecond, Strength),
|
||
|
|
};
|
||
|
|
vibrationData = new VibrationData(Virbators);
|
||
|
|
}
|
||
|
|
Network.SendVibrationMsg("AndroidService", "127.0.0.1", vibrationData);
|
||
|
|
}
|
||
|
|
}
|