0

初めてダイレクト 3D を使用しています。バウンディング ボックス (長方形/円柱/球) ​​を表現する方法を探しています。境界ボックスの輪郭を描くにはどうすればよいですか? これはシェーダーですか、それとも他のものを使用してアウトライン シェイプを作成しますか?

チェスター

4

1 に答える 1

3

最も簡単な方法は、ライン リストを使用してユニット ワイヤフレーム バウンディング ボリュームを作成することです。変換マトリックスを使用すると、3D ワールド内の任意のオブジェクトの周りでボリュームをスケーリング、変換、または回転できます。

これを実現するには、次の 3 つの主要部分が必要です。

  1. ラインリスト頂点が設定された一定の VB と IB (原点を中心に配置する必要があり、単位長は 1 であることに注意してください)、およびインスタンスごとのデータ用の VB。
  2. インスタンスごとのメンバーとして変換行列を受け取る入力レイアウト。
  3. 立方体の各頂点に変換行列を適用する頂点シェーダー。(ピクセル シェーダーは、指定された色を出力するだけで済みます)。

(同じ原則が球、ハルなどにも適用されることに注意してください)

私が使用するシェーダーは次のようになります。

struct WIRE_VS_INPUT
{
    float3 Position     : POSITION;
    float4 Color        : COLOR0;
    float3 Transform    : TRANSFORM;
    float3 Size         : SIZE;  
};

struct WIRE_VS_OUTPUT
{
    float4 Position     : SV_POSITION; 
    float4 Color        : COLOR0;
};

WIRE_VS_OUTPUT WireBoxVS( WIRE_VS_INPUT Input )
{
    WIRE_VS_OUTPUT Output;
    Output.Position = mul(float4((Input.Position * Input.Size) + Input.Transform,1),g_mWorldViewProjection);
    Output.Color = Input.Color;
    return Output;    
}

float4 WireBoxPS( WIRE_VS_OUTPUT Input ) : SV_TARGET
{ 
    return Input.Color;
}

キューブ VB と IB のセットアップ:

const DirectX::XMFLOAT3 kWireCube[] =
{
    DirectX::XMFLOAT3(-1,-1,-1),
    DirectX::XMFLOAT3(1,-1,-1),
    DirectX::XMFLOAT3(1,1,-1),
    DirectX::XMFLOAT3(-1,1,-1),
    DirectX::XMFLOAT3(-1,-1,1),
    DirectX::XMFLOAT3(1,-1,1),
    DirectX::XMFLOAT3(1,1,1),
    DirectX::XMFLOAT3(-1,1,1)
};

const WORD kWireCubeIndices[] =
{
    0,1,
    1,2,
    2,3,
    3,0,

    4,5,
    5,6,
    6,7,
    7,4,

    0,4,
    1,5,
    2,6,
    3,7
};
于 2013-01-27T20:36:36.153 に答える