35689


以下のスクリプトの仕組みが理解できません。ただし、正常に作動はします。参考書籍は[『UnityによるVRアプリケーション開発』](https://www.oreilly.co.jp/books/9784873117577/)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度もカメラのアングルが変わっている状況は想定できません。

以上の理解はどこが間違っているのでしょうか。

[code]

    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);
        }
    }
    
[/code]


CC BY-SA 3.0
2017-06-18T14:58:55.427
35686
2017-06-18T22:55:35.940
2017-06-18T15:40:41.390
3068
23872
question
c# unity3d
UnityのC#上で記述した以下のスクリプトの理解の仕方について


> その30度をワンフレーム秒単位で割ると、仮にワンフレーム秒60分の1だとすると、3分の1という数値が導き出されます。

ここや

> なぜなら、60分の1で割っても100と同等の数値になるには、6000度の差がなければいけないからです。

この部分の計算が間違っています。 _60分の1_ で割るのは60を掛けるのと同じですので、`Time.deltaTime`が`1 /
60f`の場合の境界値は`100 / 60f`≒`1.6666…`となります。


CC BY-SA 3.0
2017-06-18T22:55:35.940
35689
2017-06-18T22:55:35.940
5750
35686
answer