Last active
December 23, 2019 12:06
-
-
Save m2wasabi/cd4db4f9e5e2d0c95c198da86e3de7e4 to your computer and use it in GitHub Desktop.
ValveIndexで指動かす最低実装
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using UnityEngine; | |
using Valve.VR; | |
namespace ValveIndexFinger | |
{ | |
public enum AvatarHand | |
{ | |
Left, | |
Right | |
} | |
public class AvatarHandController : MonoBehaviour | |
{ | |
private CVRInput input; | |
private ulong skeletonActionHandle; | |
public AvatarHand hand = AvatarHand.Right; | |
public bool printDebug = false; | |
public Avatar targetAvatar; | |
private HumanPose humanPose; | |
private HumanPoseHandler humanPoseHandler; | |
void Start() | |
{ | |
input = OpenVR.Input; | |
input.SetActionManifestPath(Application.streamingAssetsPath + "/SteamVR/actions.json"); | |
if (hand == AvatarHand.Left) | |
{ | |
input.GetActionHandle("/actions/default/in/SkeletonLeftHand", ref skeletonActionHandle); | |
} | |
else | |
{ | |
input.GetActionHandle("/actions/default/in/SkeletonRightHand", ref skeletonActionHandle); | |
} | |
// Init Avatar | |
if (!targetAvatar) | |
{ | |
targetAvatar = gameObject.GetComponent<Animator>().avatar; | |
} | |
humanPose = new HumanPose(); | |
if (targetAvatar) | |
{ | |
humanPoseHandler = new HumanPoseHandler(targetAvatar, transform); | |
} | |
} | |
void LateUpdate() | |
{ | |
if (true) | |
{ | |
VRSkeletalSummaryData_t summary = new VRSkeletalSummaryData_t(); | |
input.GetSkeletalSummaryData(skeletonActionHandle, EVRSummaryType.FromDevice, ref summary); | |
if (printDebug) DebugLogFinger(summary); | |
if (targetAvatar) | |
{ | |
humanPoseHandler.GetHumanPose(ref humanPose); | |
SetHandPose(summary); | |
humanPoseHandler.SetHumanPose(ref humanPose); | |
} | |
} | |
} | |
private void SetHandPose(VRSkeletalSummaryData_t summary) | |
{ | |
if (hand == AvatarHand.Left) | |
{ | |
var thumb = 1.0f - summary.flFingerCurl0 *2; | |
humanPose.muscles[55] = thumb; | |
humanPose.muscles[56] = thumb; | |
humanPose.muscles[57] = thumb; | |
humanPose.muscles[58] = thumb; | |
var index = 1.0f - summary.flFingerCurl1 *2; | |
humanPose.muscles[59] = index; | |
humanPose.muscles[60] = index; | |
humanPose.muscles[61] = index; | |
humanPose.muscles[62] = index; | |
var middle = 1.0f - summary.flFingerCurl2 *2; | |
humanPose.muscles[63] = middle; | |
humanPose.muscles[64] = middle; | |
humanPose.muscles[65] = middle; | |
humanPose.muscles[66] = middle; | |
var ring = 1.0f - summary.flFingerCurl3 *2; | |
humanPose.muscles[67] = ring; | |
humanPose.muscles[68] = ring; | |
humanPose.muscles[69] = ring; | |
humanPose.muscles[70] = ring; | |
var little = 1.0f - summary.flFingerCurl4 *2; | |
humanPose.muscles[71] = little; | |
humanPose.muscles[72] = little; | |
humanPose.muscles[73] = little; | |
humanPose.muscles[74] = little; | |
} | |
else | |
{ | |
var thumb = 1.0f - summary.flFingerCurl0 *2; | |
humanPose.muscles[75] = thumb; | |
humanPose.muscles[76] = thumb; | |
humanPose.muscles[77] = thumb; | |
humanPose.muscles[78] = thumb; | |
var index = 1.0f - summary.flFingerCurl1 *2; | |
humanPose.muscles[79] = index; | |
humanPose.muscles[80] = index; | |
humanPose.muscles[81] = index; | |
humanPose.muscles[82] = index; | |
var middle = 1.0f - summary.flFingerCurl2 *2; | |
humanPose.muscles[83] = middle; | |
humanPose.muscles[84] = middle; | |
humanPose.muscles[85] = middle; | |
humanPose.muscles[86] = middle; | |
var ring = 1.0f - summary.flFingerCurl3 *2; | |
humanPose.muscles[87] = ring; | |
humanPose.muscles[88] = ring; | |
humanPose.muscles[89] = ring; | |
humanPose.muscles[90] = ring; | |
var little = 1.0f - summary.flFingerCurl4 *2; | |
humanPose.muscles[91] = little; | |
humanPose.muscles[92] = little; | |
humanPose.muscles[93] = little; | |
humanPose.muscles[94] = little; | |
} | |
} | |
private void DebugLogFinger(VRSkeletalSummaryData_t summary) | |
{ | |
Debug.Log( | |
String.Format("FingerCurl : [ {0:F} , {1:F} , {2:F} , {3:F} , {4:F} ] / FingerSpread : [ {5:F}, {6:F} , {7:F} , {8:F} ]" | |
, summary.flFingerCurl0 | |
, summary.flFingerCurl1 | |
, summary.flFingerCurl2 | |
, summary.flFingerCurl3 | |
, summary.flFingerCurl4 | |
, summary.flFingerSplay0 | |
, summary.flFingerSplay1 | |
, summary.flFingerSplay2 | |
, summary.flFingerSplay3 | |
)); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment