// Moves the avatar in 3D space - pulls the tracked position of the spine and applies it to root. // Only pulls positional, not rotational. protected void MoveAvatar() { if (bodyRoot == null || c == null) { return; } if (!c.IsJointTracked()) { return; } // Get the position of the body and store it. Vector3 trans = c.GetUserPosition(); // If this is the first time we're moving the avatar, set the offset. Otherwise ignore it. if (!offsetCalibrated) { offsetCalibrated = true; xOffset = trans.x * moveRate; yOffset = trans.y * moveRate; zOffset = -trans.z * moveRate; if (offsetRelativeToSensor) { Vector3 cameraPos = Camera.main.transform.position; float yRelToAvatar = (offsetNode != null ? offsetNode.transform.position.y : transform.position.y) - cameraPos.y; Vector3 relativePos = new Vector3(trans.x * moveRate, yRelToAvatar, trans.z * moveRate); Vector3 offsetPos = cameraPos + relativePos; if (offsetNode != null) { offsetNode.transform.position = offsetPos; } else { transform.position = offsetPos; } } } // Smoothly transition to the new position Vector3 targetPos = Kinect2AvatarPos(trans); if (smoothFactor != 0f) { bodyRoot.localPosition = Vector3.Lerp(bodyRoot.localPosition, targetPos, smoothFactor * Time.deltaTime); } else { bodyRoot.localPosition = targetPos; } }