Hello,
INTRO :
I have a head tracking script for VR to rotate around. It is placed on the Camera GameObject & is sole purpose is to rotate the camera in accordance to the rotation of the head.
ISSUE:
The script woks fine but it looks like the rotation is inverted.
Target :
Mobile device (let’s say iOS & Android)
REQUEST:
I think I am making a mistake with the math functions.
Here is the script :
using UnityEngine;
using System.Collections;
public class HeadTrack : MonoBehaviour
{
private bool gyroBool;
private Gyroscope gyro;
private Quaternion rotFix;
private Vector3 initial = new Vector3(90, 180, 0);
// Use this for initialization
void Start()
{
Screen.orientation = ScreenOrientation.LandscapeLeft;
Screen.sleepTimeout = SleepTimeout.NeverSleep;
gyroBool = SystemInfo.supportsGyroscope;
Debug.Log("gyro bool = " + gyroBool.ToString());
if (gyroBool)
{
gyro = Input.gyro;
gyro.enabled = true;
rotFix = new Quaternion(0, 0, 0.7071f, 0.7071f);
}
else
{
Debug.Log("No Gyro Support");
}
}
// Update is called once per frame
void Update()
{
if (gyroBool)
{
var camRot = gyro.attitude * rotFix;
transform.eulerAngles = initial;
transform.localRotation *= camRot;
}
}
}
If anyone could point me in the right direction, I would much appreciate it.
regards,
Karsnen.
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Camera))]
public class GyroCamera : MonoBehaviour
{
private float initialYAngle = 0f;
private float appliedGyroYAngle = 0f;
private float calibrationYAngle = 0f;
private Camera myCamera;
[SerializeField]
internal GameObject[] allCubes;
private void Start()
{
#if UNITY_ANDROID
Input.gyro.enabled = true;
#endif
Application.targetFrameRate = 60;
initialYAngle = transform.eulerAngles.y;
CalibrateYAngle ();
}
private void OnEnable()
{
if(myCamera == null)
{ myCamera = this.GetComponent<Camera> ();}
}
private void OnDisable()
{}
void Update()
{
ApplyGyroRotation();
ApplyCalibration();
}
bool cubeHit = false;
private void FixedUpdate()
{
RaycastHit _raycastHit = new RaycastHit(); // create new raycast hit info object
// "vrdetection" layer = 8
if(Physics.Raycast (this.transform.position, transform.forward, out _raycastHit, Mathf.Infinity, 1 << 8))
{
_raycastHit.transform.GetComponent<Renderer> ().material.color = Color.red;
cubeHit = true;
}
else
{
if(cubeHit == true)
{
foreach (GameObject _go in allCubes)
{
_go.GetComponent<Renderer> ().material.color = Color.white;
}
cubeHit = false;
}
}
}
public void CalibrateYAngle()
{
calibrationYAngle = appliedGyroYAngle - initialYAngle; // Offsets the y angle in case it wasn't 0 at edit time.
}
void ApplyGyroRotation()
{
this.transform.rotation = Input.gyro.attitude;
appliedGyroYAngle = this.transform.eulerAngles.y; // Save the angle around y axis for use in calibration.
#if UNITY_ANDROID
this.transform.Rotate( 0f, 0f, 180f, Space.Self ); //Swap "handedness" ofquaternionfromgyro.
this.transform.Rotate( 270f, 180f, 180f, Space.World ); //Rotatetomakesenseasacamerapointingoutthebackofyourdevice.
#else
this.transform.Rotate ( 0f, 0f, 180f, Space.Self ); //Swap "handedness" ofquaternionfromgyro.
this.transform.Rotate ( 90f, 180f, 0f, Space.World ); //Rotatetomakesenseasacamerapointingoutthebackofyourdevice.
#endif
}
void ApplyCalibration()
{
transform.Rotate( 0f, -calibrationYAngle, 0f, Space.World ); // Rotates y angle back however much it deviated when calibrationYAngle was saved.
}
}