# How do I adjust code so gyro translates player to center position when device is being held in hands

I have an object in 3d space yet only moving on 2d axis (don’t want moving in z space) The controls work great for now yet when I play the game to test on mobile device, the device has to be completely flat in order to have game object centered on screen. Essentially the code is doing precisely what I AKSED it to do. What I need to know is how do I adjust the script so that I can play the game while mobile device is tilted upward and set that to translate as center position for my game object? When we play a game we hold mobile device in our hands in a slightly titled up position which is natural to gamers. Any advice is appreciated Code is here:

``````using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterController : MonoBehaviour {

public float speed = 10.0F;

void Update()
{

//Move character using gyro//

transform.Translate (Input.acceleration.x * 25.0f, Input.acceleration.y * 20f, 0);

//Constrain character movement to viewport//

Vector3 boundaryVector = transform.position;

Vector3 pos = Camera.main.WorldToViewportPoint (transform.position);
pos.x = Mathf.Clamp01(pos.x);
pos.y = Mathf.Clamp01(pos.y);
pos.z = Mathf.Clamp (transform.position.z, 100, 50);

transform.position = Camera.main.ViewportToWorldPoint(pos);

}
}
``````

After some digging I used another method for interpolating character movement which allows me to adjust for device orientation on a tilt. I have added functionality that also rotates the character slightly in the direction its moving for better effect. Here:

``````public float smooth = 0.4f;
public float newRotation;
public float sensitivity = 6;
public float xSpeed = 0f;
public float ySpeed = 0f;

private Vector3 currentAcceleration, initialAcceleration;
//public float offSetY;

Matrix4x4 calibrationMatrix;

void Start()
{
calibrate ();

initialAcceleration = Input.acceleration;
currentAcceleration = Vector3.zero;

}

void Update()
{

//Move character using gyro//

//Controls input speed
//transform.Translate (Input.acceleration.x * Xspeed, Input.acceleration.y * Yspeed, 0);
_InputDir = getAccelerometer(Input.acceleration);

//Controll character using accelerometer
transform.Translate (_InputDir.x * xSpeed, _InputDir.y * ySpeed, 0);

//Control character rotation
currentAcceleration = Vector3.Lerp(currentAcceleration, Input.acceleration - initialAcceleration, Time.deltaTime/smooth);

newRotation = Mathf.Clamp(currentAcceleration.x * sensitivity, -1, 1);
transform.Rotate(0, 0, -newRotation);

//Constrain character movement to viewport//
Vector3 boundaryVector = transform.position;

Vector3 pos = Camera.main.WorldToViewportPoint (transform.position);
pos.x = Mathf.Clamp01(pos.x);
pos.y = Mathf.Clamp01(pos.y);
pos.z = Mathf.Clamp (transform.position.z, 100, 50);

transform.position = Camera.main.ViewportToWorldPoint(pos);

}

void calibrate()
{
Quaternion rotateQuaternion = Quaternion.FromToRotation(new Vector3(0f, 0f, -1f), wantedDeadZone);
//create identity matrix ... rotate our matrix to match up with down vec
Matrix4x4 matrix = Matrix4x4.TRS(Vector3.zero, rotateQuaternion, new Vector3(1f, 1f, 1f));
//get the inverse of the matrix
calibrationMatrix = matrix.inverse;

}

//Method to get the calibrated input
Vector3 getAccelerometer(Vector3 accelerator){
Vector3 accel = this.calibrationMatrix.MultiplyVector(accelerator);
return accel;
}

//Finally how you get the accelerometer input
Vector3 _InputDir;

}
``````

The character rotates a bit slow but at least its a bit closer to what I want.