2013年6月16日日曜日

回転難しい

回転難しすぎるので、徐々にメモしつつ理解してゆこう。


回転には
・オイラー角
・クォータニオン
があるそうな。

というわけで、公式リファレンスを見てみるか。
回転を表現するやつら
transform.eulerAngles・・・・・オイラー角としての回転値
transform.rotation・・・・・・・ローカル座標での回転値
transform.Rotate・・・・・・・・オブジェクトを相対的に回転させます


んで、基本的には全部クォータニオンで内部的には処理されておる・・・と・・・

回転を相対的にアニメートさせたいなら、Rotateを使えと。
// ローカルX軸で1秒に1度回転
transform.Rotate(Time.deltaTime, 0, 0);
transform.Rotate(Vector3.right * Time.deltaTime);
transform.Rotate(Vector3.right, Time.deltaTime);
//ワールドで回したいならSpace.Worldを入れとく
transform.Rotate(Time.deltaTime, 0, 0, Space.World);


同じ事なのに3つも記述方法があるのかい!

とはいえRotationを使ってこんな風にしてもよい。
var yRotation : float = 5.0;
function Update () {
yRotation += Input.GetAxis("Horizontal");
transform.eulerAngles = Vector3(10, yRotation, 0);
}


面倒くさい感じはわかった。

角度の表し方
transform.rotation = Quaternion.identity;・・・・ワールド座標でリセット

これは便利機能?いつ使うんだろ。

これがムカつく・・・どう違うのさ・・・
var rotation = Quaternion.Euler(0, 30, 0);
var rotation = Quaternion.Euler(Vector3(0, 30, 0));


そもそも、Quaternion.Eulerっていう書き方がよくわからん・・・
クォータニオンをオイラーで表現するってこと?

って思ってたらEulerEuler.Anglesってのが・・・
それぞれ解説は
eulerAngles・・・・・回転のオイラー角を返す。
Euler・・・・・・・・オイラー角を設定します。オブジェクトを回転させるときに使います。
参照:http://docs-jp.unity3d.com/Documentation/ScriptReference/Quaternion.html

で、どういう風に使えるかというと・・・。
rotation.eulerAngles = Vector3(0, 30, 0);・・・こちらは変数にくっつけるやつ
var rotation = Quaternion.Euler(0, 30, 0);・・・でこちらは機能としてQuaternionにくっつけるやつ

この例だけではイマイチわからんな!

・・・あー・・・rotation.eulerAnglesってのはVariantsつまり変数ってことかー。
で、Quaternion.Eulerってのは関数なわけね。
rotation.eulerAngles = Vector3(0, 30, 0);
は、rotation.eulerAnglesという変数の中に角度を代入しておると。
var rotation = Quaternion.Euler(0, 30, 0);
こちらは、変数の中にQuaternion.Euler()関数を使って角度を代入しておると。

じゃあ、Quaternion.Eulerが吐き出す値はクォータニオンなの?オイラー角なの?
いや、待てよ・・・それは関係ないのか!
何気なく、「回転を表現する」って書いたけど、こいつらは・・・
transform.eulerAngles・・・・・変数
transform.rotation・・・・・・・変数
transform.Rotate・・・・・・・・関数

ってことなのか。やっとリファレンスが"Variables(変数)"と"Functions(関数)"に別れている意味がわかった・・・かも。
つまり、回転にRotateを使うってことは、それは関数の機能を使うってことで、rotationを使うと回転させる機能自体は自分で作らなきゃいけないってことかー。

あ、だから、Quaternion.Euler()っていう書き方は、Quaternionっていう「名前」の関数のEulerっていう機能を呼び出しているって考えればいいのか。
わかりやすいんだかわかりにくいんだか微妙だけど。


いや、つまり何が問題でこんなメモを作ったかというと・・・。

transform.rotation = Quaternion.AngleAxis( 130, Vector3(1, 0, 0));
print(transform.rotation);
print(transform.eulerAngles);

とした時に、以下の様な結果になるわけです。
(0.9, 0.0, 0.0, 0.4)
(50.0, 180.0, 180.0)

オイラーだと何故かYとZに180ずつ入ってしまうと。
かと言って、クォータニオンでは角度がわからん・・・。

で、何で角度を取りたいかというと、回転制限をかけたいんです。・・・・うーむ。どうしたものか・・・。 

<解決案1>角度の変化量を別の変数に入れとくか・・・ 

0 コメント:

コメントを投稿