前回の続きで長方形のCubeを転がしてみる。
スクリプトの変更点
正方形依存のマジックナンバーをなくしてちゃんと計算する。
具体的には初期角度と円運動の半径のところ。
この辺の計算は深く考えずに実装したのでもっと簡単に書けたりするかもしれない。
あと長方形だと回転後のx, y, z方向の大きさが欲しいので curScale として保存する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
... private Vector3 curScale; //現在の大きさ void Start() { curScale = cube.transform.localScale; } void Update () { ... } IEnumerator CubeRolling(Vector3 sv,Vector3 mv,Vector3 r){ isRolling =true; float _th0= Mathf.Abs( mv.x*Mathf.Atan(Mathf.Abs(curScale.y/curScale.x)) + mv.z*Mathf.Atan(Mathf.Abs(curScale.y/curScale.z)) ); float _r = Mathf.Abs( mv.x*curScale.x/2f/Mathf.Cos(_th0)+ mv.z*curScale.z/2f/Mathf.Cos(_th0) ); for(int i=1;i<=rollFrame;i++){ float _th = Mathf.Lerp(0, Mathf.PI / 2f, (float)i/rollFrame); float _x = mv.x * _r * (Mathf.Cos (_th0) - Mathf.Cos (_th0 + _th)); float _y = _r * (Mathf.Sin(_th0 + _th) - Mathf.Sin (_th0)); float _z = mv.z * _r * (Mathf.Cos (_th0) - Mathf.Cos (_th0 + _th)); cube.transform.position = new Vector3(sv.x + _x, sv.y + _y, sv.z + _z); cube.transform.Rotate(r/rollFrame,Space.World); yield return null; } curScale = cube.transform.rotation * cube.transform.localScale; isRolling =false; } |
これで cube がどんな大きさでもころころ転がる。