dwelling act 4 (live motion cap w/ kinect azure)
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.
 
 
 
 
 

113 lines
4.3 KiB

using UnityEngine;
using System.Collections;
using com.rfilkov.kinect;
namespace com.rfilkov.components
{
public class JointPositionView : MonoBehaviour
{
[Tooltip("Depth sensor index - 0 is the 1st one, 1 - the 2nd one, etc. -1 means the sensor doesn't matter")]
public int sensorIndex = -1;
[Tooltip("Index of the player, tracked by this component. 0 means the 1st player, 1 - the 2nd one, 2 - the 3rd one, etc.")]
public int playerIndex = 0;
[Tooltip("The Kinect joint we want to track.")]
public KinectInterop.JointType trackedJoint = KinectInterop.JointType.Pelvis;
[Tooltip("Whether the movement is relative to transform's initial position, or is in absolute coordinates.")]
public bool relToInitialPos = false;
[Tooltip("Whether the z-movement is inverted or not.")]
public bool invertedZMovement = false;
[Tooltip("Scene object that will be used to represent the sensor's position and rotation in the scene.")]
public Transform sensorTransform;
//public bool moveTransform = true;
[Tooltip("Smooth factor used for the joint position smoothing.")]
public float smoothFactor = 0f;
[Tooltip("UI-Text to display the current joint position.")]
public UnityEngine.UI.Text debugText;
private Vector3 initialPosition = Vector3.zero;
private ulong currentUserId = 0;
private Vector3 initialUserOffset = Vector3.zero;
private Vector3 vPosJoint = Vector3.zero;
void Start()
{
initialPosition = transform.position;
}
void Update()
{
KinectManager kinectManager = KinectManager.Instance;
if (kinectManager && kinectManager.IsInitialized())
{
if (sensorIndex >= 0 || kinectManager.IsUserDetected(playerIndex))
{
ulong userId = sensorIndex < 0 ? kinectManager.GetUserIdByIndex(playerIndex) : (ulong)playerIndex;
if (sensorIndex >= 0 || kinectManager.IsJointTracked(userId, trackedJoint))
{
if (sensorTransform != null)
{
if(sensorIndex < 0)
vPosJoint = kinectManager.GetJointKinectPosition(userId, trackedJoint, true);
else
vPosJoint = kinectManager.GetSensorJointKinectPosition(sensorIndex, (int)userId, trackedJoint, true);
}
else
{
if (sensorIndex < 0)
vPosJoint = kinectManager.GetJointPosition(userId, trackedJoint);
else
vPosJoint = kinectManager.GetSensorJointPosition(sensorIndex, (int)userId, trackedJoint);
}
vPosJoint.z = invertedZMovement ? -vPosJoint.z : vPosJoint.z;
if (sensorTransform)
{
vPosJoint = sensorTransform.TransformPoint(vPosJoint);
}
if (userId != currentUserId)
{
currentUserId = userId;
initialUserOffset = vPosJoint;
}
Vector3 vPosObject = relToInitialPos ? initialPosition + (vPosJoint - initialUserOffset) : vPosJoint;
if (debugText)
{
debugText.text = string.Format("{0} - ({1:F2}, {2:F2}, {3:F2})", trackedJoint,
vPosObject.x, vPosObject.y, vPosObject.z);
}
//if(moveTransform)
{
if (smoothFactor != 0f)
transform.position = Vector3.Lerp(transform.position, vPosObject, smoothFactor * Time.deltaTime);
else
transform.position = vPosObject;
}
}
}
}
}
}
}