この記事は機械翻訳されたものです。

快適な動作

Windows Phone の Motion クラスと 3D 表示 (機械翻訳)

Charles Petzold

コード サンプルのダウンロード

Charles PetzoldWindows Phone 7.1 を導入した新しい運動クラスは、3次元空間での携帯電話の指向方法を知る必要があるプログラマのための素晴らしいツールです。Motion クラス (加速度計、磁力計とジャイロスコープ) のセンサーからの情報を組み合わせたデータを滑らかし、便利なフォームで利用可能になります。

Windows Phone で 3D 空間での携帯電話の向きを認識できれば、携帯電話を 3D 世界へと誘うことができます。この施設は、アプリケーション マッピング, 仮想現実, 実感および、当然、ゲーム、しかし、ないまだ考案されているおそらくも一部のアプリケーションがあります。これは間違いなくあなたのコーディングのスキルと同じくらいあなたの想像力を行使するだろう場所領域です。

モーション データ

電話ではなく速度や加速度も運動クラスからご利用いただけますの向きを取得だけに集中したいと思います。MotionReading 構造、センサーを提供し、方向情報は態度プロパティで使用できます。ここでは 3 D 空間の平面の向きを示す単語「態度」飛行力学から来る — 高度に区別は地球の上の高さです。単語は、ベクトルのジオメトリも使用されます。

この態度プロパティ タイプの AttitudeReading、3次元方向を記述する 5 つのプロパティを定義する別の構造体です。

  • Float 型はラジアン単位の角度のヨー
  • Float 型はラジアン単位の角度のピッチ
  • Float 型はラジアン単位の角度のロール
  • XNA での RotationMatrix 型マトリックス、4 × 4 行列型の定義
  • 四元数は、XNA で定義された型の型の四元数

ヨー、ピッチ、ロールも飛行力学的に使用される用語と頻繁にオイラー角として言及しています。飛行機を右に回すと左、ヨー変化ヨー平面の鼻に直面している、コンパスの方向を示します。ピッチの変更のために登る鼻が上がるか、ダイビング ダウン。変更面銀行としては、左と右ロールします。これらの携帯電話関連を視覚化するには、「魔法のじゅうたんのようなあなたの携帯電話に座って電話で飛んで」画面携帯電話あなたの前に、あなたの後ろに 3 つの標準のボタンの上に想像できます。

この記事のダウンロード コードに含まれる YawPitchRoll と呼ばれる小さなプログラムは、これらの角度を視覚化も役立つかもしれない。(すべてのプログラムのようなこの資料では、それが必要 Microsoft.Devices.Sensors と Microsoft.Xna.Framework のアセンブリへの参照です。)示すように図 1、プログラムがこれら 3 つの角度を度に変換の値を表示、それもその値をグラフィカルに象徴。


図 1 YawPitchRoll の表示

ピッチ、およびロールは、地球の方向をロールバックするようである固体のボールとして表示されるに対しヨー、コンパスのような北を指す単純な線が表示されます。携帯電話を画面と北を指し示す、携帯電話のトップ レベルのテーブルに座っているとき、すべての 3 つの角度ゼロ値があります。

携帯電話のトップを上下傾斜とは、携帯電話の上をポイントしたとき、電話-90 ° に直立時にピッチ 90 ° から変更できます。同様に、ロールから 90 °-90 ° に右と左の電話を転換することで変更できます。

携帯電話のディスプレイに直面しているすると、南ヨー角をポイントします。ピッチと-90 ° -180 ° から 90 °、180 ° の範囲の値になります。YawPitchRoll プログラムでは、これらの値は、中空、赤概説のボールによって象徴されています。ロールの値は、-90 ° から 90 ° の範囲の値を続けます。

回転展望

三次元宇宙で私たちの全体の生活を過ごすが、私たちの多くは、3 次元の回転の非常に貧しい直感的把握があります。その結果、可視化および回転 3D スペースでの操作は難しい場合があります。ヨー、ピッチとロールは、3 D 空間で回転を十分に説明ようだけど、彼らの実用的なプログラミングではかなり厄介になります。

プログラマは多く作業 3D 回転を記述するための代替方法を好みます。

  • 3D ベクトル (軸/角度回転) の周りの回転を記述する 1 つの角度
  • 回転行列 (フル 3 D マトリックス変換のサブセット)
  • 四元数は、3 D のアナログの複素平面での 2D の回転

私は 7 章と 8 の私の本の「3 d Programming for Windows」で示すようにこれらのフォームすべての間変換できます (Microsoft Press、2008年).それは線形補間をそれ自身を貸すので四元数のスムーズな動き 1 つの方向から別に特に便利です。

回転マトリックスおよび四元数、3 D 回転運動のクラスを提供しますが、AttitudeReading 構造体の RotationMatrix プロパティにのみ焦点を当てるよ。これは標準的な 4 × 4 の行列は、XNA のマトリックス値がのみ回転行列を表します。それは、スケーリングなしと翻訳があります。M14、M24、M34、M41、M42、M43 フィールドすべて 0、M44 フィールド 1 です。

この回転行列を操作する場合、分析観点の変更が役に立つでしょう。このコラムの以前の分割払いでは、どのように、3次元ベクトル、加速度計とコンパスのセンサーから利用可能な 3 D 座標系に電話の地理に課せられたです.ただし、回転行列を操作する場合、実際に 2 つ別の 3 D 座標系、携帯電話と他の地球のために 1 つを視覚化する必要。

  • 携帯電話の 3 D 座標システムでは、正の Y (縦モードで) は、電話の上にポイント X 点と肯定的な肯定的な Z 画面から来る。
  • 地球の 3 D 座標系の正の Y は、北、東ポイント X 肯定的なポイントし、正の Z を地面から来る。

携帯電話を画面を平らな面で座っているし、北を指し示すトップ、RotationMatrix 値が単位行列か。それ以外の場合は、それは反対の電話からの相対の地球の回転方法について説明します、オイラー角で表現回転。

これを説明するには、MotionMatrix と呼ばれる小さなプログラムを書いています。表示 (に示すように図 2) の数値だけで構成されます: ヨー、ピッチ、およびロールの値、3 × 3 回転マトリックス サブセットの完全の行列、および回転の軸/角の形で表現されます。

The MotionMatrix Display
図 2 MotionMatrix の表示

このプログラムと遊ぶの初回起動時には、あなたの即時の本能は、おそらくすべてのオイラー角 0 は、電話を方向づけるためです。ただしがほとんどないので回転軸の値はほとんど何もすることができますダウン軸ベクトル下部はクレイジーです。単純な回転表示穏やかな。スクリーン ショットで図 2 北ですが約 45 ° 高架電話ポインティングのトップを示しています。これは、何ピッチ値レポートと非常に近い値が 46 ° の軸/角度の回転を示します。

回転の軸を通知: は約 (-1, 0, 0)、携帯電話の左を指す座標の軸であります。XNA 軸/角度回転は右手の法則により従うこと: あなたの右手の親指を軸の方向にポイント (には、携帯電話の左側にこの場合です)。あなたの指のカーブは、正の回転方向を示しています。これは、意味回転ピッチ角度の反対側です。携帯電話が-45 ° を回転させる地球を配置する必要がありますに告げてください。

MotionMatrix と XNA

それは、電話で 3D オブジェクトを表示するため運動クラスから回転行列を使用する合理的なようです。しかし通常のアプローチではなく — どこ 3D オブジェクトは回転表示基準は、おそらくマウスまたは指で — 表示の基準に、3 D オブジェクトを回転しますここ (概念的には、とにかく)。

これを試すから archive3d、アンティークの電話の 3 D モデルをダウンロードしました。net の Web サイト (特に bit.ly/GSNTi3) と 3 ds 形式をオートデスクから変換ツールを使用して、XNA 優しい FBX 形式に変換します。このオブジェクトを表示するの漸進的により良い方法を示す 4 つの Visual Studio プロジェクトを作成します。(実際はかなり少しの周りの隆盛し、だけ後でその事実を隠すためにはこれら 4 つのプロジェクトを作成した !)ソース コードのダウンロード時間を短縮するには、同じ 3 D モデルのファイルのすべての 4 つのプロジェクトを参照します。

4 つのプロジェクトの最初のオブジェクトの静的なビューだけです View3DPhonePlain と呼ばれる; 図 3 関連のコードを示しています。このプログラム モデルでは、負荷を非常に多くのモデルを拡張し、簡単なカメラを定義を世界変換を定義します。(フィールド変数の見かけの万国感覚直後になります。

図 3 View3DPhonePlain プログラム

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    Model model;
    Matrix scaleMatrix, worldMatrix, lookatMatrix,
           viewMatrix, projectionMatrix;
    ...
protected override void LoadContent()
    {
        model = this.Content.Load<Model>(“Phone Retro Caesar N170910”);
        foreach (ModelMesh mesh in model.Meshes)
            foreach (BasicEffect effect in mesh.Effects)
                effect.EnableDefaultLighting();
        // World matrix
        scaleMatrix = Matrix.CreateScale(0.0001f);
        worldMatrix = scaleMatrix;
        // View matrix
        lookatMatrix = Matrix.CreateLookAt(new Vector3(0, 0, 10f),
                                                       Vector3.Zero,
                                                       Vector3.Up);
        viewMatrix = lookatMatrix;
        // Projection matrix
        float aspectRatio = 
            graphics.GraphicsDevice.Viewport.AspectRatio;
        projectionMatrix =
            Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
                                                aspectRatio,
                                                1f, 100.0f);
    }
    ...
protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        model.Draw(worldMatrix, viewMatrix, projectionMatrix);
        base.Draw(gameTime);
    }
}

XNA のような 3 D グラフィカル システムでモデル マトリックス変換表示への道のシリーズにさらされています。 ワールド変換が最初に適用し、この 3 D 空間におけるモデル situates です。 カメラ連続を適用する 2 つの変換の組み合わせです: ビュー変換アカウントの位置と向きをカメラの中に射影トランス フォームは遠近効果を処理し、またクリッピングのためのすべての座標を正規化します。

図 4 モデルどの XNA でショー既定の風景モードと私たちが期待するかもしれないそれはかなりです。

The View3DPhonePlain Display
図 4 View3DPhonePlain の表示

次のステップは、View3DPhoneReoriented という名前のプロジェクトです。 XNA 内で使用される 3 D 座標センサーによって使用される 3 D 座標系と同じだったので、ポートレート モードにスイッチしたいと思います。 これはゲームの誘導体のコンス トラクターにいくつかのステートメントを追加するは簡単です。

graphics.IsFullScreen = true;
   graphics.PreferredBackBufferWidth = 480;
   graphics.PreferredBackBufferHeight = 800;

また、携帯電話自体の方向を変更したいです。 前述のとおり、運動クラスによって提供される 3 D 回転行列を単位行列、携帯電話を画面とテーブルの上に座っているときと北を指し示すトップです。 その位置に電話をしたときに表示される 3 D 電話たかった 私は単に世界変換する X 軸回りの回転を追加、携帯電話の上部に上から見た場合探しているしたいと思います:

worldMatrix *= Matrix.CreateRotationX(MathHelper.PiOver2);

この結果を図 5 に示します。

The View3DPhone­Reoriented Display
図 5、View3DPhone­モデルビューの表示

カメラを少しもオブジェクトをこの時点で、近くに見えます、回転行列を組み込むとき、私は電話で取得するビットを回転させることができるだろうと知っていたのでこれは気にしなかった。 (3 D の光と影の鋭いビューアー概念の欠陥を使っていますが、単純にこの道をまずださせてアプローチであり、物事を解決します。

今すぐみましょう運動クラスから回転行列を組み込みます。

概念的には、3 D オブジェクト空間では、固定しておく必要があり、携帯電話を移動異なる方向からオブジェクトを表示することがでく必要があります。 もちろん、経験"real life"のようではないこれまでからオブジェクトを見て電話を移動できないため。 オブジェクトは常に、ディスプレイが 3 D 空間で画面の向きを別のビューを与えます。

この効果を実現するには、行列がこのオブジェクトを概念的に存在する地球の座標系に携帯電話の座標系から回転を実現するオブジェクトに適用する必要があります。

我々 は単に運動クラスから RotationMatrix オブジェクト ワールド変換の計算に含めることによって、この効果を実現することができる必要があります。 View3DPhoneWorldMotion プロジェクトはこれを行います。 モーション センサーをコンス トラクターで作成、OnActivated オーバーライドで開始し、OnDeactivated のオーバーライドで停止するコードが含まれています。 [ワールド変換の計算更新の上書きを示すように感動して図 6

図 6 View3DPhoneWorldMotion の更新のオーバーライド

protected override void Update(GameTime gameTime)
{
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == 
      ButtonState.Pressed)
        this.Exit();
    worldMatrix = scaleMatrix * 
      Matrix.CreateRotationX(MathHelper.PiOver2);
    if (motion != null && motion.IsDataValid)
        worldMatrix *= motion.CurrentValue.Attitude.RotationMatrix;
    base.Update(gameTime);
}

このプログラムでは、携帯電話の方向を 3D 空間に移動するとすべての異なる方向から 3D オブジェクトを表示します。 効果は非常に滑らかですと — 私は認めなければならない-非常にクールな。

回転をシフト

プレイよりまだ、プログラムのこのバージョンでは、もっと何かが間違っていたと感じた。

回転行列をワールド変換を適用すると、3 D オブジェクトを効果的に、カメラの相対的なだけでなく光の源に比例して回転します。 一部のシナリオでは、これは正しいでしょう。 あなたの指を使って、3 D イメージ好転することができますので、タッチのインターフェイスを実装する場合、たとえば、回転行列をワールド変換を適用する適切でしょう。

しかし、このプログラムは、パラダイムかなりでしょう。 私は携帯電話のディスプレイは、3 D オブジェクトを基準に移動し、このオブジェクトに対する光源に固定する必要がありますつまり、携帯のカメラのようなものにしたかった。 モーション センサーからの回転行列をワールド変換ではなく、ビュー トランス フォームを適用する必要があります。

プログラムの最終バージョンの-View3DPhone と呼ばれる­CameraMotion — を元のバージョンに、ワールド変換の計算を復元します。

worldMatrix = scaleMatrix;

それは光が上からではなく、電話の後ろから来ていたことを示唆も初期の回転を適用することは間違いだった。 新しい Update メソッドが表示されます図 7

図 7 View3DPhoneCameraMotion の更新のオーバーライド

protected override void Update(GameTime gameTime)
{
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == 
      ButtonState.Pressed)
        this.Exit();
    if (motion != null && motion.IsDataValid)
        viewMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) *
                        motion.CurrentValue.Attitude.RotationMatrix *
                        lookatMatrix;
    else
        viewMatrix = Matrix.CreateRotationX(MathHelper.PiOver2) *
                        lookatMatrix;
    base.Update(gameTime);
}

このイメージには、完全な効果を得るには、電話上のプログラムを試して必要が本当に図 8 1 つの可能なビューが表示されます。

One View in View3DPhoneCameraMotion
図 8 の 1 つのビューで View3DPhoneCameraMotion

Charles Petzold 長年 MSDN Magazine の寄稿者であり、現在彼の古典的な本"Windows プログラミング"(Microsoft Press、1998年) Windows 8 を更新しています。  彼の Web サイト charlespetzold.com

この記事のレビュー、技術スタッフのおかげで: Donn Morse