非同期化して高速化
今回画像処理があり、その高速化のためTaskを使って非同期化しました。
まずはカメラの画像を白黒にする普通のコード。だいたい僕のPCで20fps出るか出ないくらい。
今回画像処理があり、その高速化のためTaskを使って非同期化しました。
まずはカメラの画像を白黒にする普通のコード。だいたい僕のPCで20fps出るか出ないくらい。
コンポーネントを追加する際に、状況に応じて追加したいコンポーネントを変える方法。
C#ではClass型を変数に格納することはできないので(?)、typeof()でその型がもつType型(型宣言)が取得できる。UnityではAddComponent<T>()
の他にAddComponent(Type componentType)
があるので、生成したいコンポーネントをType型で渡してあげれば動的に追加するコンポーネントが選べる。
(そもそもこんなやり方でいいのかな…)
NURBSはNon-Uniform Rational B-Splineの略で、非一様有理Bスプライン。非一様なのでノットが一様ではなく、\((t_{i-1} \leq t < t_{i+1})\)の範囲で調整が可能。また有理なので、有理ベジェ同様に重みを加えたものがNURBS。 B-Splineでは滑らかな曲線が作れたが、NURBSの方は自然かつ意図的なカーブが作れる。製品の3DCGやCADなどによく使われる。 Continue…
B-スプライン曲線はベジェ曲線と違い、点を通らない。その代わり曲線同士の曲率(曲がり具合)が連続していて滑らかな曲線となる。曲線は基底関数を重ね合わせて表現され、重ね合わせる具合をノットという数値の集合で表す。ノットの数は制御点の数+次数+1となる。(次数+1を階数(order)と呼ぶ)
ノットの値は絶対的な数値ではなく、複数の基底関数を重ね合せる祭の相対的な数値の列であり、B-スプライン曲線では通常ノット値を0からはじめ、1ずつ増やして等間隔にする。(uniform:一様)
制御点6で次数が3の場合は10個のノット値があり
\([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\)
となる。
ベジェ曲線では真円の表現はできないらしい。なのでIllustratorで作った円は実は真円ではないので、CADなどに持っていくとおかしなことになるらしい。
github | naochang | Curve
Illustrator等でもおなじみのベジェ曲線。ベジェ曲線には次数があり、Illustratorでは3次、Flashでは絵を描くときは3次だけど、実行するときは2次に変換される。(FlashPlayer11以降は3次もサポート)
次数が大きいほど制御点が多く、少ないアンカーポイントで線を調整ができるが、処理も重たくなる。
どのような仕組みかは、こちらのアニメーションgifを見るとわかりやすい。
3次の場合は点が4つ必要になり、通るのは始点と終点のみ。残りの2点は曲線を制御するために使われる。Illustratorなどでいうところのハンドルがそれにあたる。3次の場合は4つの始点と終点のみ繋いでいくので、それを最初の点から最後の点まで繰り返して、複数の点がなめらかに繋がるように見せるが、線が滑らかになるように点にある2つのハンドルが点を挟んで線対称となるように配置する。線対称でない場合は、Illustratorでいうハンドルを折っている状態で、滑らかではなくなる。逆にこう行った操作が容易にできるベジェ曲線は特に2Dを描くのに向いているんですね。
Catmull-Romスプライン曲線は制御点を必要とせず、全ての点を通る曲線。エルミート曲線での各点のベクトルに対して下記のように前後の点の位置からベクトルを自動的に作ったもの入れるとその点を通るようになる。
最近はあまり使われないようですが、処理が軽くシンプルな3次エルミート曲線。各点にベクトルを持ち、2つの点と2つのベクトルから2点を結ぶカーブが取得できる。パラメータt\((0 \leq t \leq 1)\)を変えることにより2点の間の位置が取得可能。
式は通常3次多項式から作られ、その式の微分(tにおけるその位置での加速度)とで解いていくと式が得られる。
ほとんど参考サイトとをなぞっているだけですが、数式の出し方は以下。
いままで曲線を描くパラメトリック曲線(スプラインカーブ)についてあまりちゃんと勉強する機会がなかったので、いろいろ調べてみてUnityで実装してみた。あまりコードが洗練されていないかもしれないけど、githubへアップしてみました。[ExecuteInEditMode]で設定しているので再生しなくても動きます。
github | naochang | Curve
ざっと下記のような曲線について勉強してみました。
staticプロパティを文字列から取得する方法がわからなかったので調べてみた。
ついでに、文字列でオブジェクトのプロパティの取り出しとメソッドの実行も。
class TestClass { public static string StaticPropName = "StaticValue"; public int propName = 100; public string TestFunc(int num) { return "TestFuncValue : " + num; } } TestClass test = new TestClass(); Type testType = test.GetType(); print(testType.GetField("propName").GetValue(test)); // 出力 : 100 print(testType.GetMethod("TestFunc").Invoke(test, new object[]{ 777 })); // 出力 : TestFuncValue : 777 Type typeOfTestClass = typeof(TestClass); print(typeOfTestClass.GetField("StaticPropName").GetValue(typeOfTestClass)); // 出力 : StaticValue