alter ego
alter ego

Reputation: 69

Tilting in unity

I want to tilt my object left or right depending on which side I'm tilting my phone while object is moving forward,here is my code which is not working properly..

void Update () {
    transform.Translate(Vector3.forward * Time.deltaTime);
    if (Input.acceleration.x > 1) {
        transform.Rotate(90,0,0);
    }
    else if (Input.acceleration.x < -1) {
        transform.Rotate(-90,0,0);
    } 

Any kind of help will be greatly appreciated.Thank you.

Upvotes: 0

Views: 977

Answers (2)

Programmer
Programmer

Reputation: 125305

You have to smooth the accelerometer data before using it. Otherwise, the GameObect will be shaking or noisy while tilting the device.

You just need to convert the accelerometer value to Quaternion with Quaternion.Euler then assign the value directly to transform.localRotation of the GameObect.

int MIN = 0;
int MAX = 100;
public bool flipDirection = false;
public bool smoothAccelerometer = true;

float defaultZValue;

//Filter Accelerometer
float AccelerometerUpdateInterval = 1.0f / 30.0f;
float LowPassKernelWidthInSeconds = 1.0f;
float LowPassFilterFactor = 0;
Vector3 lowPassValue = Vector3.zero;

void Start()
{
    defaultZValue = transform.position.z;

    //Filter Accelerometer
    LowPassFilterFactor = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds;
    lowPassValue = Input.acceleration;
}


void Update()
{
    //Move Object
    transform.Translate(Vector3.forward * Time.deltaTime);

    //Get smoothed Accelerometer value values (pass in false to use raw Accelerometer values)
    Vector3 dir = LowPassFilterAccelerometer(smoothAccelerometer);

    if (Input.deviceOrientation == DeviceOrientation.LandscapeLeft || Input.deviceOrientation == DeviceOrientation.LandscapeRight)
    {
        //Check if right
        if (dir.x > 0)
        {
            float angle = mapValue(dir.x, 0f, 1f, MIN, MAX);
            if (flipDirection)
            {
                angle = angle * -1;
            }
            transform.localRotation = Quaternion.Euler(0, 0, angle);
        }
        //Check if left
        else if (dir.x < 0)
        {
            float angle = mapValue(dir.x, -0f, -1f, -MIN, -MAX);
            if (flipDirection)
            {
                angle = angle * -1;
            }
            transform.localRotation = Quaternion.Euler(0, 0, angle);
        }
        //Middle(No direction)
        else
        {
            //Use Default Angle
            transform.localRotation = Quaternion.Euler(0, 0, defaultZValue);
        }
    }
}

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
    return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}

//Filter Accelerometer
Vector3 LowPassFilterAccelerometer(bool smooth)
{
    if (smooth)
        lowPassValue = Vector3.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor);
    else
        lowPassValue = Input.acceleration;

    return lowPassValue;
}

Upvotes: 1

Sourav Paul Roman
Sourav Paul Roman

Reputation: 696

use these instead:

private Quaternion localRotation;
public float speed = 1.0f;
void Start () 
{
localRotation = transform.rotation;
}
void Update()
{
float curSpeed = Time.deltaTime * speed;

localRotation.y += Input.acceleration.x * curSpeed;
localRotation.x += Input.acceleration.y * curSpeed;

transform.rotation = localRotation;
}

for gamedev q&a : stackexchange gamedev

Upvotes: 0

Related Questions