2009年07月17日

Silverlight3SDK出ました

ランタイムや英語版SDKは既に先週リリースされていましたが、昨日やっとこ日本語版SDKもリリースされました。

Visual Studio 2008 SP1 用 Microsoft® Silverlight™ 3 Tools

(Silverlight ToolsはSDKも含むので、別途SDKをインストールする必要はないです)

なぜかSDKにドキュメントが含まれていないようなので、ドキュメントは別途ダウンロードする必要があります。ただし、日本語版ドキュメントは8月下旬の予定で、まだ英語版しかありません。日本語ドキュメント出ました。

Microsoft Silverlight 3 オフライン ドキュメント

Microsoft Silverlight 3 Offline Documentation (英語)

Silverlight3の新機能

私が紹介しなくても、既に散々あちこちで紹介されていると思いますが、私の視点から見たSilverlight3の新機能を紹介しておきます。

・3Dエフェクト

Silverlight3が最初にアナウンスされたとき、3Dと聞いてDirect3Dのような機能に期待した人も多かったと思います。実際には3Dオブジェクトを自由に描画できるような機能ではなく、Silverlightのコントロールを3D回転させて表示できる機能です。画面に表示されるコントロールやジオメトリならば、全て3次元回転でき、回転した状態でも入力等が可能です。

実際に回転させながら入力をしたりすることはないと思うので、画面の切り替えや画像が現れるときのエフェクトの一種として使うのが一般的でしょうか。

・ピクセルシェーダエフェクト

Silverlight3では、ピクセルシェーダを使って画面にエフェクトをかけることもできます。ただし、シェーダの実行はソフトウェアで、3Dアクセラレータは使用されません。

Silverlightはシェーダコンパイラは搭載していないので、DirectX SDKのシェーダコンパイラツールで予めコンパイルしておく必要があります。

ピクセルシェーダに関しては、ドキュメントに情報がなさすぎるので、後で色々調べてまとめようと思います。

・ビットマップ画像操作、Rawオーディオ対応

むしろSilverlight2までで出来なかったことの方が不思議な、ビットマップ画像を自由に操作する機能が加わりました。ただし、SetPixel/GetPixelのような操作が可能なものではなく、Int32の配列を画像化するだけの機能です。

Rawオーディオは、無圧縮のオーディオです。実行時に音を生成して再生することが可能になりました。しかし、遅延が1秒以上あるようなので、インタラクティブ性の高い使い方はできそうにないです。もっとストレートに言うと、ゲーム機のエミュレータ等には使い物にならないです。Microsoftが用意したシンセサイザーのデモがありますが、ダイヤルを回してもすぐには音に反映されなくて気持ち悪いです。

・ブラウザ外での実行

Silverlightは本来ブラウザ内で実行されるプラグインですが、スタンドアロンアプリケーションとして実行できるようになりました。しかし、ブラウザ外での実行でも、セキュリティレベルはブラウザ内と同じなので、できることはあまりないです。(その分、セキュリティの心配は無用)

複雑なことをやろうとするとネット環境が必要ですが、ネットに繋がっているのならばブラウザ外で実行する利点もほとんどないので、使いどころは微妙かもしれません。

主な使い道は、ゲーム系、小道具系アプリケーションといったところでしょうか。ブログの記事エディタをSilverlightで作って、オフラインでも記事が書けるようにするのも良いかもしれません。(Windows Live Writerの方がいいけどね)

ちなみに、Macでもちゃんと動きます。

・ナビゲーションフレームワーク

Silverlightのような動的コンテンツが抱える問題として、コンテンツ内でのページ遷移が、ブラウザのページ移動履歴に反映されないという点があります。

ナビゲーションフレームワークを使うと、Silverlight内でのページ遷移がブラウザにも認識され、進む/戻るボタンで移動できるようになります。また、ページごとにアドレスも変化するので(URLのアンカー部分が変わる)、トップページ以外にリンクするディープリンクも可能です。

Flashでも出来ることですし、Silverlight2+JavaScriptでも出来ますが、標準でフレームワークが用意されたのは助かります。

・新しいコントロールが大量に追加された

Silverlight ToolkitというSilverlightのコントロールを開発しているプロジェクトがあるのですが、そこから成熟レベルまで完成度の高まったコントロールが、標準コントロールとして取り入れられています。

ただし、追加された多くのコントロールは、ランタイムに内蔵されているのではなくライブラリでの提供なので、使用する際には参照の追加などの操作が必要になります。

サンプル等

Silverlight SDK sample browser (機能ごとの簡単なサンプル集)

New Features – Silverlight 3 (新機能を使ったアプリケーション例)

New Features in Silverlight 3 (プログラマ向けのコーディング説明ビデオ)

タグ:Silverlight
2009年07月17日 【プログラミング】 | コメント(1) |
2009年06月19日

3D CGにおける行列の豆知識

内積・外積の話をしたついでに、行列の豆知識的なことを書いておきます。Direct3Dの行ベクトルに合わせているので、OpenGL等で列ベクトルを扱う場合は、行と列を入れ替えてください。

基底ベクトルを並べた物が回転行列になる

回転行列というのは、変換後の座標系の基底ベクトルをそのまま並べたものになります。Direct3Dで使う行ベクトルの場合は、行列の各行が基底ベクトルになります。

matrix

この性質は非常に便利で、ある方向を向かせるための回転行列は、その方向ベクトルとそれに直行するベクトルを用意してあげれば簡単に作ることができます。また、逆に姿勢行列から向きを表すベクトルが欲しいときは、行列の成分を抜き出すだけで得ることができます。一般的にZ軸の正の方向を正面として扱うので、そのようなオブジェクトの向きは姿勢行列の3行目と等しくなります。

正規直行行列は転置すると逆行列になる

正規直行基底からなる行列を、正規直行行列(あるいは単に直行行列)と言います。正規直行基底とは、長さが1でお互いに直行している基底のことです。回転行列は正規直行行列になります。

一般的に逆行列を求めるのは面倒な計算で、必ずしも逆行列が存在するとも限りません。しかし、正規直行行列では転置するだけで必ず逆行列になるので、非常に簡単に求まります。

スケーリングやせん断変形、並行移動などの回転以外の変換が混じっていると正規直行ではなくなるので、姿勢を行列で持つ場合はそれらと回転成分とは分けておいた方が便利です。

左から行列を掛けるとローカル座標系での変換になる

姿勢を行列で保持している場合に、姿勢行列に対して左から変換行列を掛けると、ローカル座標系での変換になります。逆に右から掛けると、グローバル座標系での変換になります。

例えば飛行機の機首上げ(ピッチアップ)は、第三者から見れば飛行機の姿勢によって回転軸が変わりますが、その飛行機からすれば常に同じ方向の回転です。このような回転はローカル座標系で処理すると簡単になります。

VIEW行列は世界を動かす

3D CGではWORLD、VIEW、PROJECTIONという三段変換をよく使います。概念的にはワールド行列はオブジェクトの位置を表し、ビュー行列はカメラの位置を表しています。

しかし、実際のビュー行列の中身というのはこの考え方とは全くの逆で、カメラは動かずに世界を動かしてカメラに合わせるという変換をします。ワールド行列の感覚でビュー行列を作ると逆になってしまうので注意が必要です。

タグ:代数幾何
2009年06月19日 【プログラミング】 | コメント(0) |
2009年06月18日

外積の使い方

前回は内積のことを書いたので、今回はその友達の外積についてです。

内積も便利な道具ですが、外積も同じくらいかそれ以上に便利なもので、さらに内積と力を合わせると非常に強力な武器となります。

外積の定義は内積と比べると少し複雑で、ベクトルA(x1,y1,z1)とベクトルB(x2,y2,z2)の外積は次のようになります。

A×B = (y1*z2 - y2*z1, z1*x2 - z2*x1, x1*y2 - x2*y1)

内積の結果がスカラー値だったのに対して、外積の結果はベクトルである点が大きく違います。また、内積は何次元でも同じように定義されますが、外積は3次元ベクトルでしか使えません。(実際には1,3,7次元で使えるらしい。他の次元でも使える一般化した外積を定義するという試みも有ります)

外積の結果はこの式を見ても何のことだか分かりにくいと思います。実はこのベクトルは、AともBとも直行するベクトルです。外積には交換法則が成り立たず、A×BB×Aでは結果は逆向きのベクトルになります。また、|A×B|はABを辺とする平行四辺形の面積に等しくなります。

ところで、平行四辺形の面積というのは、底辺×高さと小学校で習ったと思いますが、Bを底辺とすると次のようになります。

S = |B| * h

高さhは三角関数を使って書くと |A|sinθ なので次のようになります。(θはABのなす角)

S = |A||B|sinθ

内積がcosと関係が深い計算なら、外積はsinと関係が深い計算になります。ここからsinθ=の式に変換するのは簡単ですね。

3次元ベクトルでしか使えない外積ですが、2次元の処理でも(x,y,0)と3次元に拡張すれば使うことができ、色々と面白い使い方があります。その場合、結果のベクトルは必ずx,y成分が0になってz成分だけが変化するので、z成分だけを計算して使います。

それでは、外積の使い道をいくつか挙げていきます。

法線ベクトルを求める

ある平面上の一直線上にない3点が分かれば、そこから法線ベクトルを求めることができます。三角形などの多角形なら、並行でない2辺から計算できます。

三角形の面積を求める

平行四辺形の面積は底辺×高さ、三角形の面積は底辺×高さ÷2と非常によく似ているので、三角形の面積も外積から簡単に求まります。

ある点が右左どちらにあるか分かる

内積では前後関係が分かりましたが、外積では左右が分かります。ただし、この判定は3Dだと使いにくいので、主に2Dで使います。(3Dの場合は右向きベクトルとの内積を取る方が楽)

2Dでの左右の判定は、自分の向きを表す方向ベクトルと、自分から相手への方向ベクトルの外積を取り、結果のベクトルのz成分の正負の符号で分かります。

凸多角形と点の内外判定ができる

凸多角形とは、180度以上の角を持たない多角形です。(ちなみに凸という字は凸多角形ではありません)

凸多角形の辺を時計周りに調べたとき、点Pが全ての辺に対して右側にある場合、Pは凸多角形の中にあります。(半時計回りなら左側)

この前の回転する矩形も凸多角形なので、この方法が使えます。

タグ:代数幾何
2009年06月18日 【プログラミング】 | コメント(0) |
2009年06月17日

内積の使い方

前回の話でベクトルの内積が出てきたので、ついでに内積の使い道をいくつか書いておきます。

まず、内積の定義だけ書いておきます。証明は教科書を読んでください。

ベクトルA(x1,y1,z1)、ベクトルB(x2,y2,z2)において、ABの内積は次のようになります。

AB = |A||B|cosθ

= x1*x2+y1*y2+z1*z2

ここでは3次元ベクトルを例にしましたが、内積は何次元のベクトルでも同じように定義されます。

最初の式にcosθが出てくるのに注目してください。内積の使い道は、このcosの性質を利用するものが多く、cosの使い道とも言えます。

2つのベクトルのなす角θにおけるcosθの値を求める

定義をちょっと変形するだけで、cosθが求まります。

cosθ = (AB)÷(|A||B|)

= (x1*x2+y1*y2+z1*z2)÷(sqrt(x1^2+y1^2+z1^2)*sqrt(x2^2+y2^2+z2^2))

特にABが単位ベクトルの場合は、分母の部分が1になるので省略でき、AB=cosθになります。3D CG等では方向を表すのに単位ベクトルをよく使うので、cosθが欲しいときは簡単な計算で得られます。

直線上に垂線をおろした点の長さを求める

前回の話に出てきたものです。これはcosの定義そのもので、直角三角形においてcosに斜辺の長さを掛けると底辺の長さになります。

ベクトルAが斜辺だとすると、cosθ=の式の両辺に|A|を掛けて次のように変形します。

|A|cosθ = (AB)÷|B|

Bを正規化したベクトルにこの値を掛ければ、垂線と交差する具体的な座標を得ることもできます。

また、平面と点Pの距離というのも、点Pから平面の法線に対して垂線をおろしたときの距離と考えることができるので、この性質が使えます。

相手が自分の前にいるのか後ろにいるのか判別する

自分から相手までの方向ベクトルと、自分の向きの方向ベクトルの内積をとり、その符号を調べることで、相手が自分の前方にいるのか後方にいるのか分かります。

cosは0度を中心とする山になっており、±90度以上でマイナスの値になります。相手が前にいるということは、自分の向いている方向から90度以内にいるということなので、cosの符号を見れば前後関係が分かります。

符号だけでなく具体的なcosの値を比較すれば、前方45度の範囲というような判別も簡単にできます。敵キャラクタに視野の幅を持たせるときに使えます。

タグ:代数幾何
2009年06月17日 【プログラミング】 | コメント(0) |
2009年06月15日

回転する矩形と点の当たり判定

単純な2Dのゲームでは、XY軸と並行な矩形だけを扱います。そのような矩形と点の当たり判定というのは、単純な座標の大小関係で判定することができます。

if (x >= lelt && x <= right && y >= top && y <= bottom)
{
    // 矩形と点の衝突
}

しかし、ゲームに回転の要素が入ってくるとこのアプローチでは対応しきれなくなり、回転する矩形と点の当たり判定を処理する必要があります。

やり方は色々あるのですが、ベクトル大好きっ子の私としては、こういう問題はベクトル演算で解きたくなります。

まず、矩形の1点を基準とし、点Pまでの相対位置ベクトルをP、矩形の2辺のベクトルをそれぞれV1V2とします。また、V1V2の長さを1に正規化したベクトルをそれぞれN1N2とします。

回転する矩形と点P

ここでN1Pの内積は、N1に沿った線上に点Pから垂線を降ろしたときの長さと等しくなります。同様にN2Pの内積も、N2に沿った線上の長さになります。もし、点PがN1と逆方向にある場合は、内積の値は負の値になります。

よって、点Pが矩形内に含まれる条件は

0 ≦ N1P ≦ |V1| かつ 0 ≦ N2P ≦ |V2|

となります。

ちなみに、この不等式の両辺をそれぞれ|V1|、|V2|で割ると

0 ≦ N1P÷|V1| ≦ 1  (以下V2の式は省略)

ここでN1=V1÷|V1|なので

0 ≦ V1P÷|V1|^2 ≦ 1

また、|V1|^2=V1V1なので

0 ≦ (V1P)÷(V1V1) ≦ 1

となります。(^2は2乗を表します)

|V1|やN1の計算には平方根が必要ですが、この形に変形すると平方根が消えて、内積(加算と乗算)と除算だけになります。こちらの方が計算が軽いですし、式も分かりやすくて良いと思います。条件式が定数になるので、最適化も効きそうです。ただし、|V1|が0になると0除算エラーになるので注意してください。

今回は矩形の角を基準にしましたが、中心を基準にする場合は

-1 ≦ (V1P)÷(V1V1) ≦ 1

となり、更にabs()を利用すると

abs((V1P)÷(V1V1)) ≦ 1

となります。(V1は中心から辺までのベクトルで、上図のV1の半分の長さになります)

今回の方法は、V1V2が直行していないといけないことを忘れないでください。並行四辺形のような歪んだ四角形では使えません。

確認のために、Silverlightでデモを作ってみました。

続きを読む
タグ:代数幾何
2009年06月15日 【プログラミング】 | コメント(0) |
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。