赞
踩
1,本地leap手势数据的获取,并转换成字节码。
通过leap获取手势各关节的点坐标时,默认顺序是从大拇指到小拇指为0---4,然后关节从掌心到指尖默认为从0--1--2--3--4
- using System.Collections.Generic;
- using System;
- using UnityEngine;
- using Leap;
- using Leap.Unity;
- using PersonShare;
- using ServerCommunication;
-
- public class LocalHands : MonoBehaviour
- {
- public int HandID;
- private LeapProvider mProvider;
- public RemoteHand LeftHand = new RemoteHand();
- public RemoteHand RightHand = new RemoteHand();
-
- private int numL = 0, numR = 0;
- private const int leapHandLen= 44 * 3 * sizeof(double) + 4 * sizeof(double);
-
- //string path = "D:/Works/DEMO/Hands/Assets/StreamingAssets/";
- private List<Vector3> Pos_Left = new List<Vector3>();
- private List<Vector3> Pos_Right = new List<Vector3>();
- private byte[] currentFrameLeft = new byte[leapHandLen];
- private byte[] currentFrameRight = new byte[leapHandLen];
- private byte[] currentFrameHands= new byte[2* leapHandLen];
-
- //some varibales to send the data of Leap hands
-
- public ClientManager clientManager;
- void Start()
- {
- mProvider = FindObjectOfType<LeapProvider>() as LeapProvider;
- }
- void LateUpdate()
- {
- //1 Get hand data
- Frame mFrame = mProvider.CurrentFrame;//获取当前帧
- Hands_Model(mFrame);
-
- // 2 Connect the server
- if (clientManager == null)
- return;
- TCPConnection myTCP = clientManager.TCP;
- MessageIDInfo msgHands = new MessageIDInfo(MessageTypes.MT_SHAREHANDS);
- msgHands.ID = BitConverter.GetBytes(HandID);
-
- /// 3 Transform the left hand data to bytes
- if (Pos_Left.Count == 0)
- {
- LeftHand.Arm.Direction = new Quaternion(0,0,0,0);
- for (int i = 0; i < 44; i++)
- {
- Pos_Left.Add(new Vector3(0, 0, 0));
- }
- }
- currentFrameLeft = EncodeLeftToByteArray();
- currentFrameLeft.CopyTo(currentFrameHands, 0);
-
- //4 Transform the right hand data to bytes
- if (Pos_Right.Count == 0)
- {
- RightHand.Arm.Direction = new Quaternion(0, 0, 0, 0);
- for (int i = 0; i < 44; i++)
- {
- Pos_Right.Add(new Vector3(0, 0, 0));
- }
- }
- currentFrameRight = EncodeRightToByteArray();
- currentFrameRight.CopyTo(currentFrameHands, leapHandLen);
- msgHands.Info = currentFrameHands;
- //5 send to server
- myTCP.WriteSocket(msgHands.ToByteArray());
-
- //File.WriteAllBytes(path+"LeftHand.bytes", currentFramesLeft);
- //Debug.Log("左手数据存储成功!");
-
- //6 clear the list
-
- if (numL >= 1)
- {
- Pos_Left.Clear();
- numL = 0;
- }
-
- if (numR >= 1)
- {
- Pos_Right.Clear();
- numR = 0;
- }
- }
- void Hands_Model(Frame mFrame)
- {
- foreach (var itemHands in mFrame.Hands)//遍历左右手
- {
- if (itemHands.IsLeft)
- {
- LeftHand.Wrist= new Vector3(itemHands.WristPosition.x, itemHands.WristPosition.y, itemHands.WristPosition.z);
- LeftHand.Palm = new Vector3(itemHands.PalmPosition.x, itemHands.PalmPosition.y, itemHands.PalmPosition.z);
- LeftHand.Arm.WristPosition = new Vector3(itemHands.Arm.NextJoint.x, itemHands.Arm.NextJoint.y, itemHands.Arm.NextJoint.z);
- LeftHand.Arm.ElbowPosition = new Vector3(itemHands.Arm.PrevJoint.x, itemHands.Arm.PrevJoint.y, itemHands.Arm.PrevJoint.z);
- LeftHand.Arm.Direction= new Quaternion(itemHands.Arm.Rotation.x, itemHands.Arm.Rotation.y, itemHands.Arm.Rotation.z, itemHands.Arm.Rotation.w);
-
-
- Pos_Left.Add(LeftHand.Wrist);
- Pos_Left.Add(LeftHand.Palm);
- Pos_Left.Add(LeftHand.Arm.WristPosition);
- Pos_Left.Add(LeftHand.Arm.ElbowPosition);
-
- foreach (var itemFingers in itemHands.Fingers)//五个手指,itemHands.Fingers[0]代表大拇指
- {
- foreach (var itemBones in itemFingers.bones)//骨头的四个骨关节,NextJoint代表靠近指尖的部分,
- //PrevJoint代表靠近手腕的位置
- {
- LeftHand.Finger.Bone.PrevJoint = new Vector3(itemBones.PrevJoint.x, itemBones.PrevJoint.y, itemBones.PrevJoint.z);
- LeftHand.Finger.Bone.NextJoint = new Vector3(itemBones.NextJoint.x, itemBones.NextJoint.y, itemBones.NextJoint.z);
- Pos_Left.Add(LeftHand.Finger.Bone.PrevJoint);
- Pos_Left.Add(LeftHand.Finger.Bone.NextJoint);
- }
- }
-
- numL++;
- }
- if (itemHands.IsRight)
- {
- RightHand.Wrist = new Vector3(itemHands.WristPosition.x, itemHands.WristPosition.y, itemHands.WristPosition.z);
- RightHand.Palm = new Vector3(itemHands.PalmPosition.x, itemHands.PalmPosition.y, itemHands.PalmPosition.z);
- RightHand.Arm.WristPosition = new Vector3(itemHands.Arm.NextJoint.x, itemHands.Arm.NextJoint.y, itemHands.Arm.NextJoint.z);
- RightHand.Arm.ElbowPosition = new Vector3(itemHands.Arm.PrevJoint.x, itemHands.Arm.PrevJoint.y, itemHands.Arm.PrevJoint.z);
- RightHand.Arm.Direction = new Quaternion(itemHands.Arm.Rotation.x, itemHands.Arm.Rotation.y, itemHands.Arm.Rotation.z, itemHands.Arm.Rotation.w);
-
- Pos_Right.Add(RightHand.Wrist);
- Pos_Right.Add(RightHand.Palm);
- Pos_Right.Add(RightHand.Arm.WristPosition);
- Pos_Right.Add(RightHand.Arm.ElbowPosition);
- foreach (var itemFingers in itemHands.Fingers)
- {
- foreach (var itemBones in itemFingers.bones)
- {
- RightHand.Finger.Bone.PrevJoint = new Vector3(itemBones.PrevJoint.x, itemBones.PrevJoint.y, itemBones.PrevJoint.z);
- RightHand.Finger.Bone.NextJoint = new Vector3(itemBones.NextJoint.x, itemBones.NextJoint.y, itemBones.NextJoint.z);
- Pos_Right.Add(RightHand.Finger.Bone.PrevJoint);
- Pos_Right.Add(RightHand.Finger.Bone.NextJoint);
- }
- }
- numR++;
- }
- }
- }
- public byte[] EncodeLeftToByteArray()//编码左手
- {
- int index = 0;
-
- byte[] qua_x = BitConverter.GetBytes((double)LeftHand.Arm.Direction.x);
- qua_x.CopyTo(currentFrameLeft, index);
- index += sizeof(double);
- byte[] qua_y = BitConverter.GetBytes((double)LeftHand.Arm.Direction.y);
- qua_y.CopyTo(currentFrameLeft, index);
- index += sizeof(double);
- byte[] qua_z = BitConverter.GetBytes((double)LeftHand.Arm.Direction.z);
- qua_z.CopyTo(currentFrameLeft, index);
- index += sizeof(double);
- byte[] qua_w = BitConverter.GetBytes((double)LeftHand.Arm.Direction.w);
- qua_w.CopyTo(currentFrameLeft, index);
-
- index += sizeof(double);
- for (int i = 0; i < 44; i++)
- {
- byte[] pos_x = BitConverter.GetBytes((double)Pos_Left[i].x);
- pos_x.CopyTo(currentFrameLeft, index);
- index += sizeof(double);
- byte[] pos_y = BitConverter.GetBytes((double)Pos_Left[i].y);
- pos_y.CopyTo(currentFrameLeft, index);
- index += sizeof(double);
- byte[] pos_z = BitConverter.GetBytes((double)Pos_Left[i].z);
- pos_z.CopyTo(currentFrameLeft, index);
- index += sizeof(double);
- }
- return currentFrameLeft;
- }
- public byte[] EncodeRightToByteArray()//编码右手
- {
- int index = 0;
-
- byte[] qua_x = BitConverter.GetBytes((double)RightHand.Arm.Direction.x);
- qua_x.CopyTo(currentFrameRight, index);
- index += sizeof(double);
- byte[] qua_y = BitConverter.GetBytes((double)RightHand.Arm.Direction.y);
- qua_y.CopyTo(currentFrameRight, index);
- index += sizeof(double);
- byte[] qua_z = BitConverter.GetBytes((double)RightHand.Arm.Direction.z);
- qua_z.CopyTo(currentFrameRight, index);
- index += sizeof(double);
- byte[] qua_w = BitConverter.GetBytes((double)RightHand.Arm.Direction.w);
- qua_w.CopyTo(currentFrameRight, index);
-
- index += sizeof(double);
- for (int i = 0; i < 44; i++)
- {
- byte[] pos_x = BitConverter.GetBytes((double)Pos_Right[i].x);
- pos_x.CopyTo(currentFrameRight, index);
- index += sizeof(double);
- byte[] pos_y = BitConverter.GetBytes((double)Pos_Right[i].y);
- pos_y.CopyTo(currentFrameRight, index);
- index += sizeof(double);
- byte[] pos_z = BitConverter.GetBytes((double)Pos_Right[i].z);
- pos_z.CopyTo(currentFrameRight, index);
- index += sizeof(double);
- }
- return currentFrameRight;
- }
- }
2, 远程接收字节码后,解析并赋给自己绘制的手势
- using System;
- using UnityEngine;
- using PersonShare;
- using System.IO;
- using System.Collections;
-
- class RemoteHands : MonoBehaviour
- {
- private const int leapHandLen = 44 * 3 * sizeof(double) + 4 * sizeof(double);
- public int HandID;
- public byte[] remoteFrameHands = new byte[2 * leapHandLen+sizeof(Int32)];
-
- private byte[] currentFramesLeft = new byte[leapHandLen];
- private byte[] currentFramesRight = new byte[leapHandLen];
-
- public RemoteHand Hand = new RemoteHand();
- string Leftpath = "D:/Works/DEMO/Hands/Assets/StreamingAssets/LeftHand.bytes";
- string Rightpath = "D:/Works/DEMO/Hands/Assets/StreamingAssets/RightHand.bytes";
- public const int NUM_Wrist = 1;
- public const int NUM_Palm = 1;
- public const int NUM_BONES = 20;
- public const int NUM_JOINTS = 42;
- public const int NUM_META = 12;
- public const int NUM_ARM = 4;
-
- public GameObject[] L_Wrist = new GameObject[NUM_Wrist];
- public GameObject[] L_Palm = new GameObject[NUM_Palm];
- public GameObject[] L_Bones = new GameObject[NUM_BONES];
- public GameObject[] L_Joints = new GameObject[NUM_JOINTS];
- public GameObject[] L_Meta = new GameObject[NUM_META];
- public GameObject[] L_Arm = new GameObject[NUM_ARM];
-
- public GameObject[] R_Wrist = new GameObject[NUM_Wrist];
- public GameObject[] R_Palm = new GameObject[NUM_Palm];
- public GameObject[] R_Bones = new GameObject[NUM_BONES];
- public GameObject[] R_Joints = new GameObject[NUM_JOINTS];
- public GameObject[] R_Meta = new GameObject[NUM_META];
- public GameObject[] R_Arm = new GameObject[NUM_ARM];
- IEnumerator Loadlefthandbyte(string path)
- {
- WWW www = new WWW(path);
- yield return www;
- LoadRemoteLeftHand(www.bytes);
- }
- IEnumerator Loadrighthandbyte(string path)
- {
- WWW www = new WWW(path);
- yield return www;
- LoadRemoteRightHand(www.bytes);
- }
- private void LateUpdate()
- {
-
- Buffer.BlockCopy(remoteFrameHands,0, currentFramesLeft,0, leapHandLen);
- Buffer.BlockCopy(remoteFrameHands, leapHandLen, currentFramesRight, 0, leapHandLen);
- if (Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.L))
- {
- StartCoroutine(Loadlefthandbyte(Leftpath));
- Debug.Log("左手数据加载成功!");
- }
- else
- {
- LoadRemoteLeftHand(currentFramesLeft);
- //LoadRemoteLeftHand(LocalHands.currentFramesLeft);
-
- }
- if (Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.R))
- {
- StartCoroutine(Loadrighthandbyte(Rightpath));
- Debug.Log("右手数据加载成功!");
- }
- else
- {
- //LoadRemoteRightHand(LocalHands.currentFramesRight);
- LoadRemoteRightHand(currentFramesRight);
- }
- AddDataToJoins();
- }
- private void AddDataToJoins()
- {
- #region LeftHand
- #region Thumb
- BoneLenth(L_Joints[0], L_Joints[0], L_Bones[0]);
- BoneLenth(L_Joints[1], L_Joints[3], L_Bones[1]);
- BoneLenth(L_Joints[3], L_Joints[5], L_Bones[2]);
- BoneLenth(L_Joints[5], L_Joints[7], L_Bones[3]);
- #endregion
-
- #region Index
- BoneLenth(L_Joints[0], L_Joints[9], L_Bones[4]);
- BoneLenth(L_Joints[9], L_Joints[11], L_Bones[5]);
- BoneLenth(L_Joints[11], L_Joints[13], L_Bones[6]);
- BoneLenth(L_Joints[13], L_Joints[15], L_Bones[7]);
- #endregion
-
- #region Middle
- BoneLenth(L_Joints[16], L_Joints[17], L_Bones[8]);
- BoneLenth(L_Joints[17], L_Joints[19], L_Bones[9]);
- BoneLenth(L_Joints[19], L_Joints[21], L_Bones[10]);
- BoneLenth(L_Joints[21], L_Joints[23], L_Bones[11]);
- #endregion
-
- #region Ring
- BoneLenth(L_Joints[24], L_Joints[25], L_Bones[12]);
- BoneLenth(L_Joints[25], L_Joints[27], L_Bones[13]);
- BoneLenth(L_Joints[27], L_Joints[29], L_Bones[14]);
- BoneLenth(L_Joints[29], L_Joints[31], L_Bones[15]);
- #endregion
-
- #region Pinky
- BoneLenth(L_Joints[32], L_Joints[33], L_Bones[16]);
- BoneLenth(L_Joints[33], L_Joints[35], L_Bones[17]);
- BoneLenth(L_Joints[35], L_Joints[37], L_Bones[18]);
- BoneLenth(L_Joints[27], L_Joints[29], L_Bones[19]);
- #endregion
-
- #region Palm
- BoneLenth(L_Joints[0], L_Joints[8], L_Meta[0]);
- BoneLenth(L_Joints[8], L_Joints[16], L_Meta[1]);
- BoneLenth(L_Joints[16], L_Joints[24], L_Meta[2]);
- BoneLenth(L_Joints[24], L_Joints[32], L_Meta[3]);
- BoneLenth(L_Joints[9], L_Joints[17], L_Meta[4]);
- BoneLenth(L_Joints[17], L_Joints[25], L_Meta[5]);
- BoneLenth(L_Joints[25], L_Joints[33], L_Meta[6]);
- BoneLenth(L_Joints[0], L_Joints[32], L_Meta[7]);
- #endregion
-
- #region Arm
- BoneLenth(L_Arm[0], L_Arm[1], L_Meta[8]);
- BoneLenth(L_Arm[0], L_Arm[2], L_Meta[10]);
- BoneLenth(L_Arm[2], L_Arm[3], L_Meta[9]);
- BoneLenth(L_Arm[1], L_Arm[3], L_Meta[11]);
- #endregion
-
- #endregion
-
- #region RightHand
- #region Thumb
- BoneLenth(R_Joints[0], R_Joints[0], R_Bones[0]);
- BoneLenth(R_Joints[1], R_Joints[3], R_Bones[1]);
- BoneLenth(R_Joints[3], R_Joints[5], R_Bones[2]);
- BoneLenth(R_Joints[5], R_Joints[7], R_Bones[3]);
- #endregion
-
- #region Index
- BoneLenth(R_Joints[0], R_Joints[9], R_Bones[4]);
- BoneLenth(R_Joints[9], R_Joints[11], R_Bones[5]);
- BoneLenth(R_Joints[11], R_Joints[13], R_Bones[6]);
- BoneLenth(R_Joints[13], R_Joints[15], R_Bones[7]);
- #endregion
-
- #region Middle
- BoneLenth(R_Joints[16], R_Joints[17], R_Bones[8]);
- BoneLenth(R_Joints[17], R_Joints[19], R_Bones[9]);
- BoneLenth(R_Joints[19], R_Joints[21], R_Bones[10]);
- BoneLenth(R_Joints[21], R_Joints[23], R_Bones[11]);
- #endregion
-
- #region Ring
- BoneLenth(R_Joints[24], R_Joints[25], R_Bones[12]);
- BoneLenth(R_Joints[25], R_Joints[27], R_Bones[13]);
- BoneLenth(R_Joints[27], R_Joints[29], R_Bones[14]);
- BoneLenth(R_Joints[29], R_Joints[31], R_Bones[15]);
- #endregion
-
- #region Pinky
- BoneLenth(R_Joints[32], R_Joints[33], R_Bones[16]);
- BoneLenth(R_Joints[33], R_Joints[35], R_Bones[17]);
- BoneLenth(R_Joints[35], R_Joints[37], R_Bones[18]);
- BoneLenth(R_Joints[27], R_Joints[29], R_Bones[19]);
- #endregion
-
- #region Palm
- BoneLenth(R_Joints[0], R_Joints[8], R_Meta[0]);
- BoneLenth(R_Joints[8], R_Joints[16], R_Meta[1]);
- BoneLenth(R_Joints[16], R_Joints[24], R_Meta[2]);
- BoneLenth(R_Joints[24], R_Joints[32], R_Meta[3]);
- BoneLenth(R_Joints[9], R_Joints[17], R_Meta[4]);
- BoneLenth(R_Joints[17], R_Joints[25], R_Meta[5]);
- BoneLenth(R_Joints[25], R_Joints[33], R_Meta[6]);
- BoneLenth(R_Joints[0], R_Joints[32], R_Meta[7]);
- #endregion
-
- #region Arm
- BoneLenth(R_Arm[0], R_Arm[1], R_Meta[8]);
- BoneLenth(R_Arm[0], R_Arm[2], R_Meta[10]);
- BoneLenth(R_Arm[2], R_Arm[3], R_Meta[9]);
- BoneLenth(R_Arm[1], R_Arm[3], R_Meta[11]);
- #endregion
-
- #endregion
- }
- private void BoneLenth(GameObject J0, GameObject J1, GameObject Bone)
- {
- Vector3 from = new Vector3(0.0f, 1.0f, 0.0f);//开始轴线的方向
- Vector3 to = (J0.transform.position - J1.transform.position);//读取轴线的方向
- Vector3 zhou = Vector3.Cross(from, to);//两个向量的叉积
- float angle = Vector3.Angle(from, to);//默认夹角为0-180
- // b 到 a 的夹角
- float sign = Mathf.Sign(Vector3.Dot(zhou.normalized, Vector3.Cross(to.normalized, from.normalized)));//判断夹角的正负
- float signed_angle = angle * sign;
- Bone.transform.rotation = Quaternion.AngleAxis(angle, zhou);
- double distance = (Vector3.Distance(J0.transform.position, J1.transform.position)) / 2.0;
- float Dis = (float)distance;
- Bone.transform.localScale
- = new Vector3(Bone.transform.localScale.x, Dis, Bone.transform.localScale.z);
- Bone.transform.position = (J0.transform.position + J1.transform.position) / 2;
- }
- private void LoadRemoteLeftHand(byte[] frame)//左手解码,赋值
- {
- int index = 0;
-
- Hand.Arm.Direction.x= (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.Direction.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.Direction.z = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.Direction.w = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
-
- Hand.Wrist.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Wrist.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Wrist.z = (float)BitConverter.ToDouble(frame, index);
- L_Wrist[0].transform.position = new Vector3(Hand.Wrist.x, Hand.Wrist.y, Hand.Wrist.z);
-
- index += sizeof(double);
- Hand.Palm.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Palm.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Palm.z = (float)BitConverter.ToDouble(frame, index);
- L_Palm[0].transform.position = new Vector3(Hand.Palm.x, Hand.Palm.y, Hand.Palm.z);
-
- index += sizeof(double);
- Hand.Arm.WristPosition.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.WristPosition.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.WristPosition.z = (float)BitConverter.ToDouble(frame, index);
- L_Joints[40].transform.position = new Vector3(Hand.Arm.WristPosition.x, Hand.Arm.WristPosition.y, Hand.Arm.WristPosition.z);
- L_Joints[40].transform.rotation = new Quaternion(Hand.Arm.Direction.x, Hand.Arm.Direction.y, Hand.Arm.Direction.z, Hand.Arm.Direction.w);
-
- index += sizeof(double);
- Hand.Arm.ElbowPosition.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.ElbowPosition.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.ElbowPosition.z = (float)BitConverter.ToDouble(frame, index);
- L_Joints[41].transform.position = new Vector3(Hand.Arm.ElbowPosition.x, Hand.Arm.ElbowPosition.y, Hand.Arm.ElbowPosition.z);
- L_Joints[41].transform.rotation = new Quaternion(Hand.Arm.Direction.x, Hand.Arm.Direction.y, Hand.Arm.Direction.z, Hand.Arm.Direction.w);
-
- for (int i = 0; i < 40; i++)
- {
- float point_x=0, point_y=0, point_z=0;
-
- index += sizeof(double);
- point_x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- point_y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- point_z = (float)BitConverter.ToDouble(frame, index);
- L_Joints[i].transform.position = new Vector3(point_x, point_y, point_z);
- }
- }
- private void LoadRemoteRightHand(byte[] frame)//右手解码,赋值
- {
- int index = 0;
-
- Hand.Arm.Direction.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.Direction.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.Direction.z = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.Direction.w = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
-
- Hand.Wrist.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Wrist.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Wrist.z = (float)BitConverter.ToDouble(frame, index);
- R_Wrist[0].transform.position = new Vector3(Hand.Wrist.x, Hand.Wrist.y, Hand.Wrist.z);
-
- index += sizeof(double);
- Hand.Palm.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Palm.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Palm.z = (float)BitConverter.ToDouble(frame, index);
- R_Palm[0].transform.position = new Vector3(Hand.Palm.x, Hand.Palm.y, Hand.Palm.z);
-
- index += sizeof(double);
- Hand.Arm.WristPosition.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.WristPosition.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.WristPosition.z = (float)BitConverter.ToDouble(frame, index);
- R_Joints[40].transform.position = new Vector3(Hand.Arm.WristPosition.x, Hand.Arm.WristPosition.y, Hand.Arm.WristPosition.z);
- R_Joints[40].transform.rotation = new Quaternion(Hand.Arm.Direction.x, Hand.Arm.Direction.y, Hand.Arm.Direction.z, Hand.Arm.Direction.w);
-
- index += sizeof(double);
- Hand.Arm.ElbowPosition.x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.ElbowPosition.y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- Hand.Arm.ElbowPosition.z = (float)BitConverter.ToDouble(frame, index);
- R_Joints[41].transform.position = new Vector3(Hand.Arm.ElbowPosition.x, Hand.Arm.ElbowPosition.y, Hand.Arm.ElbowPosition.z);
- R_Joints[41].transform.rotation = new Quaternion(Hand.Arm.Direction.x, Hand.Arm.Direction.y, Hand.Arm.Direction.z, Hand.Arm.Direction.w);
-
- for (int i = 0; i < 40; i++)
- {
- float point_x = 0, point_y = 0, point_z = 0;
-
- index += sizeof(double);
- point_x = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- point_y = (float)BitConverter.ToDouble(frame, index);
- index += sizeof(double);
- point_z = (float)BitConverter.ToDouble(frame, index);
- R_Joints[i].transform.position = new Vector3(point_x, point_y, point_z);
- }
- }
- }
手势一个关节一个小球,中间用杆相连。
以上完成了手势数据的共享,但在远程端需要自己建手的三维模型
分为两步,一个是各关节点,一个是关节点的连杆。
两个关节点构成中间的连杆,连杆的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。