Skip to content

Instantly share code, notes, and snippets.

@m2wasabi
Last active December 23, 2019 12:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save m2wasabi/cd4db4f9e5e2d0c95c198da86e3de7e4 to your computer and use it in GitHub Desktop.
Save m2wasabi/cd4db4f9e5e2d0c95c198da86e3de7e4 to your computer and use it in GitHub Desktop.
ValveIndexで指動かす最低実装
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