オノデラの研究日記 in わんくま

思いついたネタを気ままに書いていくブログ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  204  : 記事  5  : コメント  500  : トラックバック  32

ニュース

プロフィール

  • ●おのでら
    宮城県在住
    主に業務向けソフトを製作

Twitter

ニュース

主なリンク

XNA 関連リンク

アイテム

ゲーマーカード


  • シルバーなのでメール送れません orz

その他

記事カテゴリ

書庫

日記カテゴリ

2008年10月11日 #

 Visual Studio と Windows Mobile SDK を使ってエミュレータで実行テストを行う場合があります。その場合、エミュレータを起動するたびに毎回エミュレータの設定を行うのが面倒なので、エミュレータ終了時に設定を保存するのが普通だと思います。

状態の保存

 しかし、たまに保存状態ファイルが壊れることがあるらしく、そうなるとエミュレータを起動することができなくなってしまいます。

 エミュレータ自体が起動できなくなるので、設定を削除することもできません。

保存状態ファイルが読み込めない

 実はこの保存状態ファイルは以下のフォルダに保存されているので、このファイルを削除することによってエミュレータを初期状態として起動することができます。

Windows Vista の場合

  • drive:\Users\[UserName]\AppData\Roaming\Microsoft\Device Emulator\

Windows XP の場合

  • drive:\Documents and Settings\All Users\Application Data\Microsoft\Device Emulator\

保存状態ファイル

参考

posted @ 15:12 | Feedback (0)

2008年10月9日 #

 Windows Mobile で .NET Compact Framework を使ってモバイルアプリケーションを作っているのですが(Twitter クライアントですw)、SIP の制御を行うために InputPanel を使おうとすると、フォームデザイナでエラーが発生するようです。

InputPanelError

 再現方法としては、まずユーザーコントロールを作成し、ユーザーコントロールに独自に作った enum プロパティをセットできるようにします。

 

 そのコントロールをフォームに貼り付けて、InputPanel を配置しようとするとエラーになるようです。しかも、InputPanel を配置しないで変数として宣言するだけでもエラーになってしまうので困ったものです。

 一応この件については Microsoft Connect にも投げたので、もしよろしければフィードバックの方お願いします。

 後、エラーが再現できるプロジェクトも置いておきました。

posted @ 13:06 | Feedback (0)

2008年9月26日 #

 書こうと思ってそのまま忘れてしまっていたのですが(^^;)、大西武さんと私の共著で「XNA 3Dゲーム制作入門」という本を執筆しました。

 本書の中も執筆していますが、付属のCDに3Dモデルにアニメーションをつけてスキンアニメーション付き X ファイルを出力できる「エルフレイナ Ver 1.2 Light」というツールと、XNA で上記の X ファイルを使ってアニメーションの制御をできるプログラムのライブラリを付けましたので、興味がある方はぜひ買って遊んでみてください。

posted @ 9:00 | Feedback (4)

2008年9月25日 #

東方地霊殿

 今までのシリーズに比べると確かに難易度が高いww ノーマルクリアするのがやっとでしたw

 下は一応クリアしたリプレイデータです。(なんか6面からリプレイすると弾にあたってしまうバグがあるらしいですがw)

posted @ 0:23 | Feedback (0)

2008年9月21日 #

前回:Windows Mobile 用の Twitter クライアント制作経過(1)

 前回 Windows Mobile 用の Twitter クライアントを製作していたんですがしばらく放置状態でしたw。

 しかし最近 Twitter に投稿することが多くなって、やっぱり自分にあったクライアントがほしいな~と思ったので制作を再開して現在改良中です。今は下のような感じになっています。

Windwos Mobile 用 Twitter クライアント 「ちーたん」

 まだβ版(Ver 0.20)という形なので一般公開はしていないんですが、もし使ってみたいっていう方がいればコメントなり、Twitter から返信していただければうれしいです。

posted @ 0:17 | Feedback (0)

2008年8月27日 #

 ちょっと遅れていまいましたが、わんくま大阪勉強会#22 に現地参加された方々、USTREAM で参加された方々お疲れ様でした。

 私はLT(ライトニングトーク)で参加させていただきましたが、こういう場で話すのは初めてというのもあり、準備に少し時間を取られてしまいました。(事前にディスプレイが映るか確認しておけばよかったですね(^^;))

 内容の方は「HLSLを使って高速な画像処理をやってみよー」というお題で、.NET Framework 3.5 SP1 から WPF で使えるようになった HLSL を使って、再生中の動画に対してリアルタイムにエフェクト(画像処理)を掛けるというデモをやってみました。

 結構量が多くて時間的にきつきつだったため早口状態になってしまい、うまく伝わったかなーという心配がありましたがどうだったでしょうか?

 とりあえず LT という短い時間だったので、こんな風に使えばできるよーというよりは、こんなことができるよーという感じで説明してみましたので、まあ頭の片隅にでもこういうものあるんだなー程度でも知っていただければうれしい限りです。

 LT だと資料が残らないので PowerPoint の資料とデモプログラムをアップしておきますので欲しい方はダウンロードしちゃってくださいw

【PowerPoint 資料】

【実行ファイル】

必要な環境

  • .NET Framework 3.5 SP1
  • Windows XP SP2 以降

 セピアの固定エフェクトですが DirectX SDK は不要です。

【プロジェクト】

必要な環境

  • Visual Studio 2008 SP1
  • Windows XP SP2 以降

 以下のプロジェクトは「Microsoft DirectX SDK (August 2008)」が必須です。エフェクトファイル(.fx)ファイルを書き換えれば任意のエフェクトを動画にかけることができます。

 以下のプロジェクトは DirectX SDK が必要ないプロジェクトですが、エフェクトファイルをコンパイルできないので動画にセピアをかけるだけのものになります。

posted @ 23:01 | Feedback (0)

2008年8月22日 #

 8月23日のわんくま大阪勉強会#22で急遽(とりこびっちの命令によって)LTをさせていただくことになりましたおのでらです。

 そのためか、今だに勉強会のLTの蘭が「とりこびと」になってますが、私がやる予定ですw(あれ結局直んないのかなww)

 話す内容ですが「HLSL を使って高速な画像処理をやってみよー」というタイトルで、.NET Framework 3.5 SP1 から使えるようになった HLSL を使ったデモをやろうかなーと思っています。

 初スピーカーでもあり、時間もかなりぎりぎりなような気がするのでぐだぐだになるかもしれませんが、話す内容がみなさんにうまく伝えられればなーと思ってます。

 

#と、出発直前に書いてみましたw

 

ついでにこんなことになってるw

posted @ 10:03 | Feedback (2)

2008年8月20日 #

ネタ元:じんわりたのしい

 えぴさんが XNA で Xbox 360 以外のコントローラーが使えるの?っという質問がありました。XNA では基本的に Xbox 360 のコントローラーしか対応しないことになっているのですが、Windows 限定であれば、他のコントローラーを使う方法があります。

 今回のサンプルでは XNA のライブラリではなく、Managed DirectX から DirectInput の DLL を参照してジョイスティックの情報を取得してみました。

 Managed DirectX のランタイムは DirectX Web インストーラーからインストールできますし、Windows Vista ならはじめからインストールされているので特に追加インストールは必要ないかと思います。

 XNA のプロジェクトから DirectInput を使うには、参照設定から「Microsoft.DirectX.DirectInput」と「System.Windows.Forms」を追加してください。名前空間も必要であれば追記してください。
 サンプルプログラムでは「using MDXDI = Microsoft.DirectX.DirectInput;」と追記して DirectInput のクラスや列挙型にアクセスしやすくしています。

 コードの方はプロジェクトおいておきますのでダウンロードして参照してみてください。

 デバッグ実行すると「LoaderLockが検出されました。」という例外が発生する場合がありますが、特に無視しても問題ないのでそのまま実行してください。(この例外に関しては MSDN フォーラムで NyaRuRu さんが詳しく書いています。また、Managed DirectX 特有の現象です)
 この例外が邪魔な場合は Visual Studio の例外チェックから「LoaderLock」を外してください。

【環境】

  • XNA Game Studio 2.0
  • Visual Studio 2005
  • Managed DirectX 1.1
  • Windows XP, Vista

【実行ファイル】

【プロジェクト】

posted @ 22:28 | Feedback (1)

2008年8月8日 #

 今回のサンプルではマウスカーソルの位置にあるモデルを選択できるようにしています。カーソルをモデルに合わせると、Hit テキストが True に変化します。

スクリーン上の位置からモデルを選択

スクリーン座標から3次元空間座標へ変換

 マウスなどで3次元空間上のモデルなどを選択したい場合があると思います。この場合は、スクリーン上の2次元座標点からモデルの存在する3次元座標に変換してあたり判定などを行う必要があります。

 しかし、2次元から3次元に要素を拡張するため、X,Y のみの2次元のスクリーン座標から、3次元座標の点を求めることはできません。たとえば、実際に画面をクリックするイメージを考えてもらうとわかるかと思いますが、クリックしたときの3次元空間の位置が、オブジェクトよりも手前の位置なのかオブジェクト自体なのか、はたまたオブジェクトの奥なのかを判定することはできません。

オブジェクトの選択対象の判断

 そのため、クリックした位置は点で表すのではなく、カメラの位置からクリックした方向に伸ばしたとして扱います。その線とオブジェクトとの衝突判定を行うことによってモデルの選択などができるようになります。ちなみに線のパラメータは XNA では Ray という構造体で扱うことができます。

スクリーンの位置から3次元空間の位置を取得

 XNA にはスクリーンでクリックした方向へ向かうような線を求めるようなメソッドなどはありません。しかし、スクリーン座標と奥行きを指定することで3次元空間の点を求めることができるので、カメラの位置と特定の深度で変換した3次元空間座標点を結ぶことによって線を求めることができます。

 スクリーン空間座標からオブジェクト空間座標を求めるには「Viewport.Unproject」メソッドを使用することで簡単に求めることができます。

// ビューポートを取得
Viewport viewport = this.GraphicsDevice.Viewport;

// スクリーンの位置を Vector3 で作成 (Z は 1.0 以下を設定)
Vector3 screenPosition = new Vector3(this.markPosition, 1.0f);

// スクリーン座標を3次元座標に変換
Vector3 worldPoint = viewport.Unproject(screenPosition,
                                        this.projection,
                                        this.view,
                                        Matrix.Identity);

 第1引数にはスクリーン座標に深度を含めた Vector3 を渡します。X, Y にはスクリーンの座標を設定し、Z に深度の値を設定します。深度はプロジェクションマトリックスの「nearPlaneDistance」と「farPlaneDistance」のパラメータに依存し、0.0f を指定するとカメラの位置から nearPlaneDistance の距離、1.0f を指定するとカメラの位置から farPlaneDistance の距離を求めることができます。

 第2引数にはプロジェクションマトリックス、第3引数にはビューマトリックスを指定します。

 戻り値としてオブジェクト空間ベクトルを求めることができます。

レイの作成

 線のパラメータには Ray 構造体が使用できます。コンストラクタの第1引数にレイの開始点を指定し、第2引数にレイの向きを指定します。

 開始点にカメラの位置を設定し、向きに変換済みの3次元空間座標からカメラの位置を引いて向きを算出します。向きは Vector3.Normalize メソッドで単位ベクトルにしています。

// マークが指す方向へのレイを作成
Ray ray = new Ray(this.cameraPosition,
                    Vector3.Normalize(worldPoint - this.cameraPosition));

球とレイの当たり判定

 コンテンツパイプラインから読み込んだ ModelMesh クラスには BoundingSphere プロパティというメッシュを包括した球データが含まれています。このクラスの Intersects メソッドに先ほど作成した Ray を指定することによって球とレイが衝突しているかを調べることができます。

 衝突する場合はレイの開始点と衝突ポイントの距離が返ります。衝突しない場合は null が返るので、サンプルでは null 判定で衝突しているか調べています。

 ただし、このメソッドを使用する場合はモデルが原点に配置されていることが前提です。もし、モデルを移動させている場合は、レイをモデルの移動に合わせて座標変換する必要があります。

 ちなみに今回のサンプルモデルは球なので、正確なあたり判定ができると思います。

// 球とレイとの当たり判定を行う
this.isHit = false;
foreach (ModelMesh mesh in this.model.Meshes)
{
    if (mesh.BoundingSphere.Intersects(ray) != null)
    {
        // 球とレイは交差している
        this.isHit = true;
        break;
    }
}

サンプルプロジェクト

静的サイト

  • 後でまとめますw
posted @ 1:12 | Feedback (2)

2008年7月27日 #

 3Dゲームなどでキャラクターの頭上に名前を表示したい場合など、キャラクターの3次元空間位置から文字を表示すべきスクリーン座標を算出する必要があります。

 一件難しい計算しなければいけないように思えますが、実はポリゴンの頂点データが3次元座標からスクリーン座標に変換される計算式と同じ方法で求められるので、特に新しい知識が必要になることはありません。

 さらに簡単に計算できるメソッドも用意されているので、特に計算しなければいけないようなコードは書かなくても大丈夫です。

3次元座標からスクリーンへの座標変換

フィールド

 サンプルでは3つのモデルを表示させているので、Model と 3つの位置情報である Vector[3] を定義しています。また、動きがわかりやすいようにカメラ用の自動回転角度を定義しています。

/// <summary>
/// モデル
/// </summary>
private Model model = null;

/// <summary>
/// 位置の配列
/// </summary>
private Vector3[] positions = new Vector3[3];

/// <summary>
/// カメラの水平回転角度
/// </summary>
private float theta = 0.0f;

更新処理

 カメラを自動回転させるための回転角度をゲーム経過時間から求めています。

// カメラの水平角度を自動更新
this.theta = (float)gameTime.TotalGameTime.TotalSeconds / 2.0f;

描画前処理

 スプライトを描画後は深度バッファが無効になっている場合があるので、DepthBufferEnable プロパティを true に設定しておきます。

 すでに作成済みのビューマトリックスに対して Y軸回転マトリックスを掛け合わせると、カメラの位置を注視点を軸に回転させることができます。マトリックスの掛け合わせる順番には注意してください。

// Zバッファを有効にする
this.GraphicsDevice.RenderState.DepthBufferEnable = true;

// ビューマトリックスに回転を合成算出
Matrix rotatedView = Matrix.CreateRotationY(this.theta) * this.view;

ビューポートの取得

 Viewport は3次元空間座標からスクリーン座標に変換するメソッドが用意されているので、GraphicsDevice から取得しておきます。

// ビューポート取得
Viewport viewport = this.GraphicsDevice.Viewport;

3次元座標からスクリーンの座標算出

 3次元空間座標からスクリーン座標を求めるには Viewport.Project メソッドを使うだけで簡単に求められます。

 第1引数に変換元の3次元空間位置を指定し、第2引数にプロジェクションマトリックス、第3引数にビューマトリックスを指定します。すると、戻り値としてスクリーン上の座標が取得できます。

 あとは、Vector3 から X, Y の値を取り出せば、テキストの表示位置をして使用することができます。(Z は深度位置になります)

// 3次元座標からスクリーンの座標算出
Vector3 v3 = viewport.Project(this.positions[i],
                                this.projection,
                                rotatedView,
                                Matrix.Identity);
Vector2 screenPosition = new Vector2(v3.X, v3.Y);

// テキスト描画
this.spriteBatch.DrawString(this.font, "Model " + (i + 1).ToString(),
    screenPosition, Color.White);

サンプルプロジェクト

静的サイト

posted @ 19:26 | Feedback (0)