Platform SDK: DirectX

IDirect3DDevice7::ComputeSphereVisibility

IDirect3DDevice7::ComputeSphereVisibility メソッドは、このデバイスの現在のビューポートにおける球の配列の可視性 (完全、一部、不可視) を計算する。

HRESULT ComputeSphereVisibility( 
  LPD3DVECTOR lpCenters,         
  LPD3DVALUE  lpRadii,           
  DWORD       dwNumSpheres,      
  DWORD       dwFlags,           
  LPDWORD     lpdwReturnValues   
); 

パラメータ

lpCenters
ワールド空間座標における、各球の中心点を記述する D3DVECTOR 構造体の配列。
lpRadii
各球の半径を表す D3DVALUE 変数の配列。
dwNumSpheres
球の数。0 より大きな値を設定する。
dwFlags
現在は使用されていない。0 を設定する。
lpdwReturnValues
DWORD 値の配列。この配列は初期化の必要はないが、テストされる球ごとに DWORD を含むことができる大きさがなければならない。このメソッドが返ると、配列の各要素には、このデバイスの現在のビューポートにおける球の可視性を示すフラグの組み合わせが格納される。球の可視性が完全の場合、lpdwReturnValues の対応するエントリは 0 になる。以下に示すフラグを組み合わせて配列に与えることができる。

基本クリッピング フラグ

D3DCLIP_BACK
すべての頂点を視錐台の背面でクリッピングする。
D3DCLIP_BOTTOM
すべての頂点を視錐台の底面でクリッピングする。
D3DCLIP_FRONT
すべての頂点を視錐台の前面でクリッピングする。
D3DCLIP_LEFT
すべての頂点を視錐台の左側面でクリッピングする。
D3DCLIP_RIGHT
すべての頂点を視錐台の右側面でクリッピングする。
D3DCLIP_TOP
すべての頂点を視錐台の上面でクリッピングする。
D3DCLIP_GEN0 through D3DCLIP_GEN5
すべての頂点を対応するアプリケーション定義クリップ面でクリッピングする。

組み合わせと一般フラグ

D3DSTATUS_CLIPINTERSECTIONALL
すべての CLIPINTERSECTION フラグの組み合わせ。
D3DSTATUS_CLIPUNIONALL
すべての CLIPUNION フラグの組み合わせ。
D3DSTATUS_DEFAULT
D3DSTATUS_CLIPINTERSECTIONALL と D3DSTATUS_ZNOTVISIBLE フラグの組み合わせ。この値が、デフォルトである。
D3DSTATUS_ZNOTVISIBLE
レンダリングされたプリミティブが不可視であることを示す。このフラグは、Z チェックを使用するレンダリングを実行する際、システムによって設定またはクリアされる (D3DRENDERSTATE_ZVISIBLE を参照すること)。

クリップ交差フラグ

D3DSTATUS_CLIPINTERSECTIONBACK
視錐台後方クリップ面の頂点のクリップ フラグの論理積をとる。
D3DSTATUS_CLIPINTERSECTIONBOTTOM
視錐台の下の頂点のクリップ フラグの論理積をとる。
D3DSTATUS_CLIPINTERSECTIONFRONT
視錐台前方クリップ面の頂点のクリップ フラグの論理積をとる。
D3DSTATUS_CLIPINTERSECTIONGEN0 through D3DSTATUS_CLIPINTERSECTIONGEN5
アプリケーション定義クリップ面のクリップ フラグの論理積をとる。
D3DSTATUS_CLIPINTERSECTIONLEFT
視錐台の左側の頂点のクリップ フラグの論理積をとる。
D3DSTATUS_CLIPINTERSECTIONRIGHT
視錐台の右側の頂点のクリップ フラグの論理積をとる。
D3DSTATUS_CLIPINTERSECTIONTOP
視錐台の上の頂点のクリップ フラグの論理積をとる。

クリップ結合フラグ

D3DSTATUS_CLIPUNIONBACK
D3DCLIP_BACK と同じ。
D3DSTATUS_CLIPUNIONBOTTOM
D3DCLIP_BOTTOM と同じ。
D3DSTATUS_CLIPUNIONFRONT
D3DCLIP_FRONT と同じ。
D3DSTATUS_CLIPUNIONGEN0 through D3DSTATUS_CLIPUNIONGEN5
D3DCLIP_GEN0 から D3DCLIP_GEN5 と同じ。
D3DSTATUS_CLIPUNIONLEFT
D3DCLIP_LEFT と同じ。
D3DSTATUS_CLIPUNIONRIGHT
D3DCLIP_RIGHT と同じ。
D3DSTATUS_CLIPUNIONTOP
D3DCLIP_TOP と同じ。

戻り値

成功すれば D3D_OK を返す。

失敗すれば、次のいずれかの値を返す。

D3DERR_INVALIDMATRIX
DDERR_INVALIDOBJECT
DDERR_INVALIDPARAMS

注意

球の可視性は、ワールド、ビュー、および射影の合成行列の逆行列を使って視錐台をモデル空間に逆トランスフォームすることにより計算する。この合成行列を逆行列にトランスフォームできない場合 (行列式が 0 の場合) は、メソッドは失敗し、D3DERR_INVALIDMATRIX を返す。

次の C コードは、ComputeSphereVisibility の使用方法を示す。

D3DVECTOR center = {0,0,0};
D3DVALUE  radius = 1;
DWORD result = 0;

res = m_pd3dDevice->ComputeSphereVisibility(&center, &radius, 1, 0, &result);

if (res == D3D_OK)
{
    if (result & D3DSTATUS_CLIPINTERSECTIONALL)
    {
        // 球が外側にある。
        if (result & D3DSTATUS_CLIPINTERSECTIONLEFT)
            printf("Sphere left outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONRIGHT)
            printf("Sphere right outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONTOP)
            printf("Sphere top outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONBOTTOM)
            printf("Sphere bottom outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONFRONT)
            printf("Sphere front outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONBACK)
            printf("Sphere back outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONGEN0)
            printf("Sphere gen0 outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONGEN1)
            printf("Sphere gen1 outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONGEN2)
            printf("Sphere gen2 outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONGEN3)
            printf("Sphere gen3 outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONGEN4)
            printf("Sphere gen4 outside\n");
        if (result & D3DSTATUS_CLIPINTERSECTIONGEN5)
            printf("Sphere gen5 outside\n");
        }
    else
    if (result & D3DSTATUS_CLIPUNIONALL)
    {
        // 球が視錘台と交差する。
        if (result & D3DSTATUS_CLIPUNIONLEFT)
            printf("Sphere left intersect\n");
        if (result & D3DSTATUS_CLIPUNIONRIGHT)
            printf("Sphere right intersect\n");
        if (result & D3DSTATUS_CLIPUNIONTOP)
            printf("Sphere top intersect\n");
        if (result & D3DSTATUS_CLIPUNIONBOTTOM)
            printf("Sphere bottom intersect\n");
        if (result & D3DSTATUS_CLIPUNIONFRONT)
            printf("Sphere front intersect\n");
        if (result & D3DSTATUS_CLIPUNIONBACK)
            printf("Sphere back intersect\n");
        if (result & D3DSTATUS_CLIPUNIONGEN0)
            printf("Sphere gen0 intersect\n");
        if (result & D3DSTATUS_CLIPUNIONGEN1)
            printf("Sphere gen1 intersect\n");
        if (result & D3DSTATUS_CLIPUNIONGEN2)
            printf("Sphere gen2 intersect\n");
        if (result & D3DSTATUS_CLIPUNIONGEN3)
            printf("Sphere gen3 intersect\n");
        if (result & D3DSTATUS_CLIPUNIONGEN4)
            printf("Sphere gen4 intersect\n");
        if (result & D3DSTATUS_CLIPUNIONGEN5)
            printf("Sphere gen5 intersect\n");
    }
    else
    {
        printf("Sphere is inside\n");
    }
}
else
    printf("Invalid return value\n");

動作環境

  Windows NT/2000 :Windows 2000 が必要。
  Windows 95/98 : Windows 95 以降が必要。Windows 95 用に再配布可能な形で使用可能。
  バージョン :DirectX 7.0 が必要。
  ヘッダー : d3d.h で宣言。