FC2ブログ

デザインドール

デザインドールというソフトの紹介。

3Dのモデルを動かしてデッサン人形代わりにしたり3Dモデルを書き出せるソフト。
頭身や筋肉のつき方が変えられるのも特徴。

http://terawell.net
読み込み以外のほぼすべての機能が無料で使える。

・デッサンなどのポーズ集は好きなポーズがなかなか見つからない
・3Dソフトは無駄に覚える事が多すぎて面倒

と言う人には是非お勧め

2つのベクトルから回転行列を作成

Acos使うより早そうだったので作ってみたけど結局他のQuaternionとの兼ね合いで使わなかった。
きっちり計測してないけど思ったより差は出ず、処理速度は2倍くらいだった。
いつか使うかもしれないのでメモだけ。


Vector3 v1 = Vector3.Normalize(new Vector3(0, 5, 5));//適当
Vector3 v2 = Vector3.Normalize(new Vector3(5, 5, 5));//適当

Matrix m1 = Matrix.Identity;
Matrix m2 = Matrix.Identity;

Vector3 rotAxis = Vector3.Normalize(Vector3.Cross(v1, v2));//回転軸
Vector3 beforeAxisX = Vector3.Cross(v1, rotAxis);//直行確定なので正規化いらない
Vector3 afterAxisX = Vector3.Cross(v2, rotAxis);

//直行行列の場合 逆行列=置換行列 となるので逆行列を求めずに置換行列として代入することでコストを減らす(v1をZ軸に向ける行列)
m1.M11 = beforeAxisX.X;
m1.M21 = beforeAxisX.Y;
m1.M31 = beforeAxisX.Z;
m1.M12 = rotAxis.X;
m1.M22 = rotAxis.Y;
m1.M32 = rotAxis.Z;
m1.M13 = v1.X;
m1.M23 = v1.Y;
m1.M33 = v1.Z;

//(Z軸をv2に向ける行列)
m2.M11 = afterAxisX.X;
m2.M12 = afterAxisX.Y;
m2.M13 = afterAxisX.Z;
m2.M21 = rotAxis.X;
m2.M22 = rotAxis.Y;
m2.M23 = rotAxis.Z;
m2.M31 = v2.X;
m2.M32 = v2.Y;
m2.M33 = v2.Z;

Matrix ret = m1 * m2;//v1をv2に向ける行列


ねよっと。

Null結合演算子

(hoge ?? "")


(hoge == null ? "" : hoge)

と同意

ねよっと。

foreachで同じ型だけ取り出したい時

foreachで同じ型だけ取り出したい時、以下のように書かずに

foreach (var item in Items)
{
Button b = item as Button;
if (b == null) continue;
//処理
}


OfTypeを使うとシンプルに書けます!

foreach (var b in Items.OfType<Button>())
{
//処理
}


最後の()を忘れると??ってなったりします。(これを忘れないためにメモとしてこの記事を書いてたり・・・。)

ねよっと。

C#で関数の途中で処理を中断→再開する方法

ループ処理の最中でメインスレッドの流れを止めずにある関数を中断しておきたいことはたまにありますよね?
俗にいうコルーチンってやつですな。

このような時、C#ではyieldってものを使って実装できるっぽい!

早速調べてみたのでサンプルを。
こんな感じにIEnumerator を返す関数をコルーチンのように見立てて利用。
        static IEnumerator TestAction = GetTestAction();
static IEnumerator GetTestAction()
{
while (true)
{
Console.WriteLine("1");
yield return null;
Console.WriteLine("2");
yield return null;
Console.WriteLine("3");
yield return null;
}
}

上記を使う時はループ処理の中でこんなかんじに。
            while (true)
{
Console.Write("A");
TestAction.MoveNext();
Thread.Sleep(1000);
}


実行すると1秒ごとに
A1
A2
A3
A1
A2
A3

とちゃんと表示されてますね。
結構便利?!
try catchの中では使えないみたいなのでご注意を。


実行する手順は決まってるけどあるステータスの時だけ処理を止めたい・・・でもメインの流れを止めたくない・・・。
そん時に便利な機能だと思います!
実際に使う時はこんな感じになるのかな
        static IEnumerator TestAction = GetTestAction();
static IEnumerator GetTestAction()
{
while (true)
{
startAction();
while (state == hoge)//一定の状態の場合は待機
{
yield return null;
}
endAction();
yield return null;
}
}


ねよっと。
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター