105 lines
3.2 KiB
C#
105 lines
3.2 KiB
C#
|
// 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<LineRenderer>();
|
||
|
}
|
||
|
|
||
|
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)
|
||
|
}
|