2013年8月24日土曜日

回転の経験則

結局、回転について全然わからないので、
一度総当してみることにした。

プログラマが見たら大笑いだと思うが、仕方ない。
これがUnityプログラミング・ストロングスタイルだ。

やりたいことは。
1フレームにつき1度回して、90フレーム後に90度回転していること。

試した内容の詳細は後回しにして、結果を先に。
結局ちゃんと90度回転したのは以下。
obj.transform.rotation *=Quaternion.Euler(0, 1, 0);
obj.transform.rotation *=Quaternion.Euler(Vector3(0, 1, 0));
obj.transform.Rotate(0, 1, 0);
obj.transform.Rotate(Vector3(0, 1, 0));
obj.transform.eulerAngles +=Vector3(0, 1, 0);
obj.transform.eulerAngles.y +=1;

今回わかったこと。

・Quaternionを加えてゆこうと思ったら、掛けること(足せない)。
・RotateはQuaternionで指定しない。
・Vecter3(1, 1, 1)と(1, 1, 1)は別物
・Time.deltaTimeは「1フレーム」の事だと思ってたら何か少数値が入ってた。


以下が試したプログラム。
青いラインが成功。

function Update () {
if(round<90){
round++;
obj.transform.rotation +=(0, 1, 0);
obj.transform.rotation +=Vector3(0, 1, 0);
obj.transform.rotation +=Quaternion.Euler(0, 1, 0);
obj.transform.rotation *=Quaternion.Euler(0, 1, 0);
obj.transform.rotation +=Quaternion.Euler(Vector3(0, 1, 0));
obj.transform.rotation *=Quaternion.Euler(Vector3(0, 1, 0));
obj.transform.rotation +=(0, Time.deltaTime, 0);
obj.transform.rotation +=Vector3(0, Time.deltaTime, 0);
obj.transform.rotation *=Vector3(0, Time.deltaTime, 0);
obj.transform.rotation +=Vector3.up*Time.deltaTime;
obj.transform.rotation *=Vector3.up*Time.deltaTime;

obj.transform.rotation.y +=1;
obj.transform.rotation.y +=Time.deltaTime;
obj.transform.rotation.y +=Vector3.up*Time.deltaTime;

obj.transform.Rotate(0, 1, 0);
obj.transform.Rotate(Vector3(0, 1, 0));
obj.transform.Rotate(Quaternion.Euler(0, 1, 0));
obj.transform.Rotate(Quaternion.Euler(Vector3(0, 1, 0)))
obj.transform.Rotate(0, Time.deltaTime, 0);
obj.transform.Rotate(Vector3(0, Time.deltaTime, 0));
obj.transform.Rotate(Vector3.up*Time.deltaTime);
obj.transform.Rotate(Vector3.up, Time.deltaTime);

obj.transform.eulerAngles +=(0, 1, 0);
obj.transform.eulerAngles +=Vector3(0, 1, 0);
obj.transform.eulerAngles +=Quaternion.Euler(0, 1, 0);
obj.transform.eulerAngles *=Quaternion.Euler(0, 1, 0);
obj.transform.eulerAngles +=Quaternion.Euler(Vector3(0, 1, 0))
obj.transform.eulerAngles +=(0, Time.deltaTime, 0);
obj.transform.eulerAngles +=Vector3(0, Time.deltaTime, 0);
obj.transform.eulerAngles +=Vector3.up*Time.deltaTime;

obj.transform.eulerAngles.y +=1;
obj.transform.eulerAngles.y +=Time.deltaTime;
obj.transform.eulerAngles.y +=Vector3.up*Time.deltaTime;
}



ちなみに、何か別の方法なら回転しそうなのは以下。
y=1.756921まで回転してた。
obj.transform.Rotate(0, Time.deltaTime, 0);
obj.transform.Rotate(Vector3(0, Time.deltaTime, 0));
obj.transform.Rotate(Vector3.up*Time.deltaTime);
obj.transform.Rotate(Vector3.up, Time.deltaTime);
obj.transform.eulerAngles +=Vector3(0, Time.deltaTime, 0);
obj.transform.eulerAngles +=Vector3.up*Time.deltaTime;
obj.transform.eulerAngles.y +=Time.deltaTime;
これ、うまくゆかないのって、もしかしたら僕のTime.deltaTimeの理解が間違っているからかもね。

以上。

2013年8月21日水曜日

intをfloatで割るとint

いや、これ、本職のプログラマなら当然だろ!
って感じだと思うんだけど、身の程知らず&経験則だけでプログラム作ってると、こういう単純な計算は意外と疑わないんですよ。

今回は270/100.0が2.7にならなくて困った。

回転部分をやってたから、Quarternionがまーた悪さをしとるな!
って思ってたー!

これ、気付くのに3日かかった!