UnityのC#上で記述した以下のスクリプトの理解の仕方について
以下のスクリプトの仕組みが理解できません。ただし、正常に作動はします。参考書籍は『UnityによるVRアプリケーション開発』p116です。
具体的に述べると、以下のDetectMovingDown()
関数はワンフレーム毎に更新されるカメラアングルとその更新されたカメラアングルの更にワンフレーム後のカメラアングルの差を導き出した上で、そのワンフレーム分ずれたカメラアングルの差をワンフレームの秒単位で割って換算したものが、100以上であるならばtrueを返す関数だと私は理解しています。
例えば、ワンフレーム毎に更新されるカメラアングルが90度、そして、その更新されたカメラアングルの更にワンフレーム後のカメラアングルが60度だとしたら、ワンフレーム分ずれたカメラアングルの差は30度になります。すると、その30度をワンフレーム秒単位で割ると、仮にワンフレーム秒60分の1だとすると、3分の1という数値が導き出されます。結果的に3分の1は100よりも上ではないのでfalseが導き出されます。
すると、DetectMovingDown()
関数がtrueを導き出すためには、rate
がsweepRate
を超えるときのワンフレーム分の角度の差は最低でも6000度なければいけません。なぜなら、60分の1で割っても100と同等の数値になるには、6000度の差がなければいけないからです。
確かに、通常ならば6000度の差は導き出されることはないはずです。しかし、私がスマートフォンを傾けることで連動して傾くゲームオブジェクトのカメラのワンフレームの差ではDetectMovingDown()
関数がtrueを返す、すなわち、6000度の差を計算していることになります。しかし、ワンフレームに6000度もカメラのアングルが変わっている状況は想定できません。
以上の理解はどこが間違っているのでしょうか。
public class HeadGesture : MonoBehaviour {
public bool isFacingDown=false;
public GameObject Camera;
public bool isMovingDown=false;
private float sweepRate=100.0f;
private float previousCameraAngle;
void Start(){
previousCameraAngle = CameraAngleFromGround ();
}
// Update is called once per frame
void Update () {
isFacingDown = DetectFancingDown ();
isMovingDown = DetectMovingDown ();
}
private bool DetectFancingDown(){
return(CameraAngleFromGround () < 60.0f);
}
private bool DetectMovingDown(){
float angle = CameraAngleFromGround ();
float deltaAngle = previousCameraAngle - angle;
float rate = deltaAngle / Time.deltaTime;
previousCameraAngle = angle;
return(rate>=sweepRate);
}
private float CameraAngleFromGround(){
return Vector3.Angle (Vector3.down, Camera.transform.rotation * Vector3.forward);
}
}