ビューポート

ビューポートは、3Dシーンがどのように2Dウィンドウにレンダリングされるかを定義する。ビューポートは、オブジェクトがレンダリングされるデバイス上の矩形領域を定義する。

このインターフェイスのメソッドのリファレンスは、「IDirect3DRMViewport2」を参照すること。

このセクションでは、ビューポートとその構成要素、使用上のテクニックについて説明する。

カメラ

ビューポートはDirect3DRMFrameオブジェクトをカメラとして使用する。カメラフレームは、レンダリングされるシーン、表示位置および方向を定義する。ビューポートは、カメラフレームの正のz軸上にある可視オブジェクトだけを、y軸上の正方向にレンダリングする。

アプリケーションは、与えられたビューポートにカメラをセットするために、IDirect3DRMViewport2::SetCameraメソッドを用いることができる。このメソッドは、ビューポートの位置、方向、向きをカメラフレームに設定する。現在のカメラの設定を取得するには、IDirect3DRMViewport2::GetCameraメソッドを呼び出す。

視錐台

視錐台は、ビューポートカメラと相対して置かれた、シーン中の3Dボリュームである。パースペクティブビューイングでは、カメラは想像上のピラミッドの頂点に置かれる。このピラミッドは、2つのクリップ面のフロントクリッピングプレーンバッククリッピングプレーンと交差する。この前後のクリップ面の間にあるピラミッドの体積が視錐台である。視錐台内のオブジェクトだけが可視状態になる。

フロントおよびバッククリッピングプレーンと視錐台を表す図

カメラのz軸は、ピラミッドの頂点からバッククリッピングプレーンの中心を通る。ユーザのアプリケーションが、前後のクリッププレーンの位置を設定、取り出すには、IDirect3DRMViewport2::SetFrontIDirect3DRMViewport2::SetBackIDirect3DRMViewport2::GetFront、およびIDirect3DRMViewport2::GetBackメソッドを使用して行うことができる。

フロントクリッピングプレーン上のビューポートの次元がカメラのレンズの見かけ上の焦点長を決定する(これは、錐台の中のオブジェクトの拡大率を設定する方法と考えることもできる)。フロントクリッピングプレーン上のビューポート用の比例次元を設定、取り出すには、IDirect3DRMViewport2::SetFieldおよびIDirect3DRMViewport2::GetFieldメソッドを使用する。フロントクリッピングプレーン上のビューポート用の任意の次元を設定、取り出すには、IDirect3DRMViewport2::SetPlaneおよびIDirect3DRMViewport2::GetPlaneメソッドを使用する。

以下の式を使用して、フロントクリッピングプレーンの高さ (または幅) とビューイング角度との関係を決定することができる。

フロントクリッピングプレーンとビューイング角度との関係を表す式

この式で、ビューイング角度はA、フロントクリッピングプレーンのカメラからの距離はD、フロントクリッピングプレーンの高さは2hである。デバイスが正方形でなければ、したがってクリップ面が正方形でなければ、ビューイング角度はフロントクリッピングプレーンの半分の高さまたは幅の大きい方を用いて計算される。縮尺係数は、歪んだオブジェクトにならないよう、デバイスの主軸にセットする。これを望まない場合は、一様スケーリングを設定する必要がある。

前の式で使用されるディメンジョンの図

視錘台のピラミッドは、透視投影の場合にのみ適用される。平行投影においては、視錘台は立方体になる。ビューのタイプ(または投影方法)はD3DRMPROJECTIONTYPE列挙型で定義されており、IDirect3DRMViewport2::GetProjectionおよびIDirect3DRMViewport2::SetProjectionメソッドで使われる。

単位

DirectSoundは、デフォルトの単位 (メートル) が決まっている唯一のDirectXモジュールである。デフォルト単位は距離係数を使用して変更できる。しかし、Direct3D直接モードおよび保持モードでは特定のデフォルト単位がない。開発者はアプリケーションに最適な単位を決めて、プログラムに組み込む必要がある。ほとんどのアプリケーションでは、メートルかフィートが適切だが、そうでない場合もある。たとえば、太陽と月を画面に配置するときは、距離をマイル単位で計測する。また、昆虫や原子の粒子をモデリングするときは、単位をメートルやフィートよりもはるかに小さくする必要がある。DirectXは単純に「単位」ベースで動作し、実際の距離の概念は持たない。

単位を指定せずにシーンを構築すると、各種ソースからDirectXファイルをインポートするときに問題が発生する。単位はファイルに含まれておらず、任意の「単位」が自由に使えるため、標準単位を必要としない。そのため、異なるソースからインポートした2機の飛行機を正しくスケーリングすることは難しい。一方のモデルがメートル、もう一方がフィートでモデリングされていれば、一方のモデルをロードするときに、スケーリングすればよい。IDirect3DRMMeshBuilder3::Scale関数は、モデルの単位が分かっているときに使用する。モデル作成時に使用した単位が分からない場合、開発者は試行錯誤と直感的な推量で作業を進める必要がある。

DirectSoundを使用する場合は、アプリケーション全体でデフォルトの単位をメートルに設定するとよい。詳細については、DirectSound の「最小距離と最大距離」と「距離係数」を参照すること。

変換

3D座標のオブジェクトを2Dウィンドウにレンダリングするためには、オブジェクトをカメラフレーム内に変換しなくてはならない。そこで、4つの要素を持つ同質の座標[x y z w]を求めるため、射影行列が用いられる。座標[x y z w]は、3要素の座標[x/w y/w z/w]を取得するために使われる。[x/w y/w] はウィンドウが使用する座標である。また、z/wは奥行きを0から1の範囲で示し、0はフロントクリッピングプレーン、1はバッククリッピングプレーンとなる。射影行列は、透視変換の後にオブジェクトのスケーリングと移動を結合したものである。

次の値が射影行列の要素である。この等式において、h視錘台の半分の高さ、Fはカメラからの距離、Dはフロントクリッピングプレーンのz座標を示している。

射影行列

射影をした後、次のステップは、クリッピングおよびビューポート内のスクリーンピクセル座標へのxとyの変換である。このために、D3DVIEWPORTデータメンバを用いる。ビューポートは、レンダリングサーフェス上の矩形ウィンドウである。

typedef struct _D3DVIEWPORT {
    DWORD    dwSize;
    DWORD    dwX;
    DWORD    dwY;
    DWORD    dwWidth;
    DWORD    dwHeight;
    D3DVALUE dvScaleX;
    D3DVALUE dvScaleY;
    D3DVALUE dvMaxX;
    D3DVALUE dvMaxY;
    D3DVALUE dvMinZ;
    D3DVALUE dvMaxZ;
} D3DVIEWPORT, *LPD3DVIEWPORT;

dwXおよびdwYフィールドは、サーフェス上のビューポートの左上へのオフセットをスクリーンピクセルで指定する。

dwWidthおよびdwHeightフィールドは、スクリーンピクセルで表したビューポートの幅と高さである。

dvScaleXおよびdvScaleYフィールドは、スクリーン座標を生成するためにx値およびy値に適用される縮尺係数である。通常、次の等式を用いて、正規化透視ビューボリューム全体をビューポートにマッピングする。

  dvScaleX = dwWidth / 2
  dvScaleY = dwHeight / 2

たとえば−1から1のX座標は、−dwWidth / 2からdwWidth / 2にスケーリングされ、次いで、dwWidth / 2のオフセットが加えられる。このスケーリングは、クリッピングの後に行われる。

ウィンドウが正方形でなく、正しいアスペクト比を保持したければ、2つのウィンドウディメンジョンの大きい方を両スケーリング値として用いる。また、ビューボリュームの一部をクリップする必要がある。

dvMaxXdvMaxYdvinZ、およびdvMaxZフィールドは、クリップ面を指定する。x = dvMaxX、x =−dvMaxX、y = dvMaxy、y =−dvMaxY、z = dvMinZ、z = dvMaxZ。たとえば、ビューボリュームを表示するには、dvMaxX = dvMaxY = dvMaxZ = 1およびdvMinZ = 0とする。上述したように、非正方形ウィンドウで正しいアスペクト比を保持したければ、ビューボリュームの一部をクリップする必要がある。それには、以下の等式を用いる。これらの等式は、正方形ビューポートの場合にも使用することができ、したがって常に使うことができる。

dvMaxX = dwWidth / (2 * dvScaleX)
dvMaxY = dwHeight / (2 * dvScaleY)

ビューポート変換を用いると、ワールド座標でのオブジェクトの移動距離をカメラから奥行きまでの距離と一致させることができる。IDirect3DRMViewport2::Transformメソッドの結果は、4つの要素を持つベクトルで表されることに注意されたい。これによって、カメラの位置に限りなく近い座標で生じる問題を回避することができる。

フレームの変換については、「変換」を参照すること。変換の数学の概要については、「3D変換」を参照すること。

ピッキング

ピッキングとは、ビューポートのウィンドウで、2D座標からシーン上のビジュアルオブジェクトを探索するプロセスである。アプリケーションはIDirect3DRMViewport2::Pickメソッドを使用して、シーン上の最も近いオブジェクト、またはオブジェクトの重なり順のリストを取得することができる。


トップに戻る トップに戻る
© 1999 Microsoft and/or its suppliers. All rights reserved. Terms of Use.