유니티 공식문서에 있는 예제가 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;
     }
}
2014/04/08 15:04 2014/04/08 15:04

트랙백 주소 :: 이 글에는 트랙백을 보낼 수 없습니다