初めてダイレクト 3D を使用しています。バウンディング ボックス (長方形/円柱/球) を表現する方法を探しています。境界ボックスの輪郭を描くにはどうすればよいですか? これはシェーダーですか、それとも他のものを使用してアウトライン シェイプを作成しますか?
チェスター
初めてダイレクト 3D を使用しています。バウンディング ボックス (長方形/円柱/球) を表現する方法を探しています。境界ボックスの輪郭を描くにはどうすればよいですか? これはシェーダーですか、それとも他のものを使用してアウトライン シェイプを作成しますか?
チェスター
最も簡単な方法は、ライン リストを使用してユニット ワイヤフレーム バウンディング ボリュームを作成することです。変換マトリックスを使用すると、3D ワールド内の任意のオブジェクトの周りでボリュームをスケーリング、変換、または回転できます。
これを実現するには、次の 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
};