При повороте камеры при помощи акселерометра возникают колебания (дрожание камеры) при затухании движения, и далее продолжаются в состоянии покоя.
Если чувствительность = 1, то колебаний нет, всё плавно.
Следование камеры за движением телефона происходит медленно, не реалистично.
Если чувствительность > 1, колебания есть.
Чем больше чувствительность, тем реалистичнее движения, но больше колебания.
Пробую несколькими способами, но поведение одинаковое.
Гироскоп не интересует.
--------
Задача
--------
Убрать колебания (дрожания), увеличив чувствительность.
Скрипт прикладываю.
--------------------
Движение камеры
--------------------
Ориентация: Landscape.
Наклон телефона от себя или к себе поворачивает камеру в игре вверх или вниз.
Наклон телефона влево или право поворачивает камеру относительно оси Z (при этом сохраняя ощущение, что земля в игре всегда параллельна полу в вашем помещении) .
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class AccelerometerCameraControl : MonoBehaviour
{
public float sensitivityXZ = 9f;
private float rotationalAngleFactorXZ = -90f;
private Vector3 currentRotationXZ;
void LateUpdate ()
{
Way2();
}
// Quaternion.Slerp
public void Way2()
{
currentRotationXZ.x = Input.acceleration.z * rotationalAngleFactorXZ;
currentRotationXZ.z = Input.acceleration.x * rotationalAngleFactorXZ;
transform.localRotation = Quaternion.Slerp(
transform.localRotation,
Quaternion.Euler(currentRotationXZ),
Time.deltaTime * sensitivityXZ);
}
// Math.Lerp
public void Way1()
{
currentRotationXZ.y = transform.localEulerAngles.y;
currentRotationXZ.x = Mathf.LerpAngle(
transform.localEulerAngles.x,
Input.acceleration.z * rotationalAngleFactorXZ,
sensitivityXZ * Time.deltaTime);
currentRotationXZ.z = Mathf.LerpAngle(
transform.localEulerAngles.z,
Input.acceleration.x * rotationalAngleFactorXZ,
sensitivityXZ * Time.deltaTime);
transform.localRotation = Quaternion.Euler(currentRotationXZ);
}
}
using System.Collections;
public class AccelerometerCameraControl : MonoBehaviour
{
public float sensitivityXZ = 9f;
private float rotationalAngleFactorXZ = -90f;
private Vector3 currentRotationXZ;
void LateUpdate ()
{
Way2();
}
// Quaternion.Slerp
public void Way2()
{
currentRotationXZ.x = Input.acceleration.z * rotationalAngleFactorXZ;
currentRotationXZ.z = Input.acceleration.x * rotationalAngleFactorXZ;
transform.localRotation = Quaternion.Slerp(
transform.localRotation,
Quaternion.Euler(currentRotationXZ),
Time.deltaTime * sensitivityXZ);
}
// Math.Lerp
public void Way1()
{
currentRotationXZ.y = transform.localEulerAngles.y;
currentRotationXZ.x = Mathf.LerpAngle(
transform.localEulerAngles.x,
Input.acceleration.z * rotationalAngleFactorXZ,
sensitivityXZ * Time.deltaTime);
currentRotationXZ.z = Mathf.LerpAngle(
transform.localEulerAngles.z,
Input.acceleration.x * rotationalAngleFactorXZ,
sensitivityXZ * Time.deltaTime);
transform.localRotation = Quaternion.Euler(currentRotationXZ);
}
}
UPDATE 09/12/17:
Спасибо за наводку про ФНЧ.
Из этой темы у меня получился новый ассет
AR Camera ACCELEROMETER: http://u3d.as/YSM