2013年10月28日月曜日

Blender:オブジェクト原点の移動と回転

MayaだとInsertキーを押してやるアレ。
Maxだと右のタブから選んでやるアレ。

Pivotと呼ばれる、オブジェクト自身の原点の変更方法。

・移動
3DViewのメニューから
Object>Transform
のOrigin to というところを使う
BlenderではOriginと言うみたいね。

・回転
これはかなり無理矢理
正式なやり方はわからない
現状はEdit Modeに切り替えてオブジェクト自身を回転させてOriginとずらしている

本当のやり方はどうなんだろう
Posted on 8:41 | Categories:

2013年9月20日金曜日

2013年9月16日月曜日

BlenderからUnityにオブジェクトを持ってくるとSmooth Shadeになってしまう問題

http://answers.unity3d.com/questions/294558/blender-normal-smoothing-import-problem.html

ここに回答があった。

モディファイアにエッジスプリットを入れる

以前から調べていてスプリットしちゃうと後々オブジェクトの編集が難しくなるんじゃないかと思ってたんだけど、モディファイアを使うなら問題なし。

めでたしめでたし。

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日かかった!

2013年7月24日水曜日

ビルトインぼやき

サイズの変更できないビルトイン配列ってのがありますね。

で、定義の仕方は、こう。
var hairetu = new int[10];
これで、int用の10列の配列ができるわけです。

ところが・・・・
var hairetu : int[];
こういう宣言も可能なわけですが・・・

これって長さ「0」のサイズ変更出来ない配列っていう意味なんじゃないんですか???

それ、意味無くないですか?

回転に続き、配列の挙動に右往左往な日々でございます。

2013年7月17日水曜日

AwakeがStartに負けた!

前提:
static varにドラッグしてGameIbjectを登録できなかった。
普通のvarに入れてから改めでstaticに代入してた。

こんな感じ。
どの関数にも入れてないから、Awakeで実行されるはずー。
static var num :int =8;
var objsTmp =new GameObject[num];
static var objs =new GameObject[num];
for (var l:int=0; l<num; l++){
objs[l] = objsTmp[l];
}

(ちなみに、staticの配列を定義する時に使っている"num"をstaticにしないで使うと、
上記"objsTmp"には使えるけれど、staticなobjsでは使えない!)


と、こ、ろ、が!

Startでこれを利用しようとしたら、何故かnullが帰ってくる。

Updateを使って代入タイミングをみると最初のフレームではまだnullのまま。
あれー?
Awake > Start > Update
の順で実行されるんじゃなかったっけ?
ちなみに、最初の1フレーム目だけnullで後は正常に代入されていた。


Updateでも間に合ってないって...

とりあえずStartを最初にyieldしたら読めた。
なんでこうなるのかわかんないけど、動くからいいかー。

追記=========
これは、間に合ってないんじゃなかった。

オブジェクトA・・・変数をAwakeで定義するスクリプトを保持
オブジェクトB・・・オブジェクトAの変数をStartで参照

という構成だったので、つまりはオブジェクトの表示タイミングが違ったために起こったわけです。
最初からシーンに表示していても、これは起こるので、現在は、オブジェクトAのAwake処理の最後に、終了フラグを仕込んで、オブジェクトBのスクリプトのStartはそちらのフラグを見て実行するように変更しています。