유니티 공식문서에 있는 예제가 Giral 이라서 수정해서 사용중...
원링크 : http://docs.unity3d.com/Documentation/Manual/Input.html
하단에 보면 Low Pass Filter 부분이 있는데 엉망임...
var AccelerometerUpdateInterval : float = 1.0 / 60.0; var LowPassKernelWidthInSeconds : float = 1.0; private var LowPassFilterFactor : float = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds; // tweakable private var lowPassValue : Vector3 = Vector3.zero; function Start () { lowPassValue = Input.acceleration; } function LowPassFilterAccelerometer() : Vector3 { lowPassValue = Mathf.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor); //문제부분 return lowPassValue; }
여기서 문제는 바로 Mathf.Lerp 즉, 선형보간 함수의 사용법이 틀렸다.
정확히는 Mathf.Lerp(float, float, float) 형태로 정의되어야 하는데 실제 들어가는 값은 무려 Vector3 타입!
따라서, 본 예제는 다음과 같이 수정되어야 한다.
lowPassValue = Mathf.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor); //문제부분 lowPassValue = Vector3.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor); //수정된 부분
이를 활용한 모바일 Tilt 예제는 다음과 같다.
using UnityEngine; using System.Collections; public class Behavior_Cam_Tilt : MonoBehaviour { public Transform _dog; Vector3 _InitPos; float _beforeX = 0f; private float _Velocity = 0.0F; float AccelerometerUpdateInterval = 1f / 60f; float LowPassKernelWidthInSeconds = 1f; private float LowPassFilterFactor = 0f; //private Vector3 lowPassValue = Vector3.zero; private float lowPassValue = 0f; void Start() { _InitPos = transform.position; LowPassFilterFactor = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds * 1.5f; } float LowPassFilterAccelerometer() { lowPassValue = Mathf.Lerp(lowPassValue, Input.acceleration.x, LowPassFilterFactor); return lowPassValue; } void Update(){ SetTiltAngle(); } void SetTiltAngle() { float _Accx = LowPassFilterAccelerometer(); if (Mathf.Abs(_Accx) > 0.45f) return; float _length = 6.632358f; //원래는 계산해야 하지만, 삼각함수 값은 상수로 쓰는게 빨라서 45도 각도에 대한 상수값과 거리를 계산한 결과임. if (_Accx >= 0f) { transform.position = Vector3.Slerp(_InitPos, new Vector3(_length * -1f, 1.8f, _length), _Accx); } else { transform.position = Vector3.Slerp(_InitPos, new Vector3(_length, 1.8f, _length), _Accx * -1f); } transform.LookAt(new Vector3(_dog.position.x, _dog.position.y + 0.73f, _dog.position.z)); _beforeX = _Accx; } }