Assignment for RMIT Mixed Reality in 2020
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.
 
 
 

134 lines
2.9 KiB

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using VRTK;
public class CoriolisDisplay : MonoBehaviour
{
[Header("References")]
[SerializeField]
private RotationController m_ship;
[SerializeField]
private GameObject m_segmentPrefab;
[SerializeField]
private Transform m_tip;
[Header("settings")]
[SerializeField]
private int m_segmentCount = 20;
[SerializeField]
private float m_segmentSpacing = 0.5f;
[SerializeField]
private float m_coriolisMultiplier = 1;
private VRTK_InteractableObject m_interactable;
private List<GameObject> m_segments = new List<GameObject>();
private void Awake()
{
if (m_ship == null)
m_ship = FindObjectOfType<RotationController>();
m_interactable = GetComponent<VRTK_InteractableObject>();
}
private void OnEnable()
{
RegisterEvents(true);
}
private void OnDisable()
{
RegisterEvents(false);
DestroySegments();
}
private void Update()
{
UpdateSegments();
}
private void GenerateSegments()
{
for (int i = 0; i < m_segmentCount; i++)
{
GameObject segment = Instantiate(m_segmentPrefab);
segment.transform.position = transform.position;
m_segments.Add(segment);
}
}
private void DestroySegments()
{
foreach (GameObject segment in m_segments)
{
Destroy(segment);
}
m_segments.Clear();
}
private void UpdateSegments()
{
if (m_segments == null || m_segments.Count == 0)
return;
Vector3 position = m_tip.position;
Vector3 direction = m_tip.forward;
Vector3 shipDirection = m_ship.RotationAxis;
foreach(GameObject segment in m_segments)
{
Vector3 force = 2 * Vector3.Cross(direction, m_ship.RotationAxis) * (2 * Mathf.PI / m_ship.RotationPeriod);
direction = (direction + force * m_coriolisMultiplier).normalized * m_segmentSpacing;
position = position + direction;
segment.transform.position = position;
segment.transform.forward = direction;
}
}
private void OnGrab(object sender, InteractableObjectEventArgs args)
{
GenerateSegments();
}
private void OnDrop(object sender, InteractableObjectEventArgs args)
{
DestroySegments();
}
private void RegisterEvents(bool value)
{
if (value)
{
m_interactable.InteractableObjectGrabbed += OnGrab;
m_interactable.InteractableObjectUngrabbed += OnDrop;
}
else
{
m_interactable.InteractableObjectGrabbed -= OnGrab;
m_interactable.InteractableObjectUngrabbed -= OnDrop;
}
}
}