// Copyright 2016 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This script is not available for versions of Unity without the // GVR native integration. using UnityEngine; using System.Collections; /// This script positions and rotates the transform that it is attached to /// according to a joint in the arm model. See GvrArmModel.cs for details. public class GvrArmModelOffsets : MonoBehaviour { #if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR) /// Used to draw a line between joints for debugging purposes. private LineRenderer lineRenderer; public enum Joint { Pointer, Wrist, Shoulder, Elbow } /// Determines which joint to set the position and rotation to. public Joint joint; /// Determines what object to draw a line to (for debugging purposes). public GameObject debugDrawTo; void Awake() { lineRenderer = gameObject.GetComponent(); } void Start() { if (GvrArmModel.Instance != null) { GvrArmModel.Instance.OnArmModelUpdate += OnArmModelUpdate; } else { Debug.LogError("Unable to find GvrArmModel."); } } void OnDestroy() { if (GvrArmModel.Instance != null) { GvrArmModel.Instance.OnArmModelUpdate -= OnArmModelUpdate; } } private void OnArmModelUpdate() { Vector3 jointPosition; Quaternion jointRotation; switch (joint) { case Joint.Pointer: jointPosition = GvrArmModel.Instance.pointerPosition; jointRotation = GvrArmModel.Instance.pointerRotation; break; case Joint.Wrist: jointPosition = GvrArmModel.Instance.wristPosition; jointRotation = GvrArmModel.Instance.wristRotation; break; case Joint.Elbow: jointPosition = GvrArmModel.Instance.elbowPosition; jointRotation = GvrArmModel.Instance.elbowRotation; break; case Joint.Shoulder: jointPosition = GvrArmModel.Instance.shoulderPosition; jointRotation = GvrArmModel.Instance.shoulderRotation; break; default: throw new System.Exception("Invalid FromJoint."); } transform.localPosition = jointPosition; transform.localRotation = jointRotation; DrawDebugLine(); } private void DrawDebugLine() { if (lineRenderer == null || debugDrawTo == null) { return; } if (lineRenderer.useWorldSpace) { lineRenderer.SetPosition(0, transform.position); lineRenderer.SetPosition(1, debugDrawTo.transform.position); } else { lineRenderer.SetPosition(0, Vector3.zero); lineRenderer.SetPosition(1, transform.InverseTransformPoint(debugDrawTo.transform.position)); } } #endif // UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR) }