差分

ナビゲーションに移動 検索に移動

AABB

1,180 バイト除去, 2017年11月10日 (金) 11:48
RenderTargetUsage列挙体は、グラフィックデバイス('''AABB''' (語源:Axis Aligned Bounding Box)とは、「軸に平行な直方体」という意味であり、3Dゲームなどで[[MonoGame/クラスライブラリ/GraphicsDeviceクラス|GraphicsDeviceクラス衝突判定]])に新たなレンダリングターゲット([[MonoGame/クラスライブラリ/RenderTarget2Dクラス|RenderTarget2Dクラス]])を設定したとき、そのレンダリングターゲットの[[データ]]をどのように処理するかを指定するのに使用する列挙体である。に用いる見えない四角形の領域を指す。日本語では「豆腐」などとも呼ばれる。
== 名前空間 ==* 3Dモデルの衝突判定を[[MonoGame/クラスライブラリ/Microsoft.Xna.Framework.Graphics名前空間|Microsoft.Xna.Framework.Graphics名前空間レイキャスト]]などを使ってクソ真面目に[[ポリゴン]]単位で行うと非現実的なくらい物凄い負荷になる。そこでモデルを覆うようなXYZ軸に平行な立方体(全部同じ角度の立方体)を動的に作り出し、AABBどうしで当たり判定を行えば、いわゆる2DなアクションゲームのX軸Y軸の衝突判定処理にZ軸の処理を加えるだけでよく非常に軽い処理となる。[[モデル]]単位のAABBでは大雑把すぎるという場合は[[ボーン]]単位などでAABBを用意して衝突判定を行うという手法が使われる。
== 構文 == public enum RenderTargetUsageゲーム以外の3Dアプリでも「[[マウス]]でモデルを掴むように動かす操作」を実現するためにAABBを利用しているのがほとんどである。
== フィールド =={| class="wikitable"|+! 値! 概要|-| DiscardContents| 常にレンダリングターゲットのデータを削除する。|-| PlatformContents| プラットフォームに応じて扱いを変える。使うな危険。|-| PreserveContents| 常にレンダリングターゲットのデータを保持する。|}[[物理演算エンジン]]での衝突判定では[[レイキャスト]]などを使ってクソ真面目に計算していることが多いため、そのような場合の高速化には表示用のモデルとは別に見えないローポリゴンモデルを被せるように用意して物理演算エンジンに喰わせることもある。これはAABBとは別の技術だが、実のところ物理演算エンジン内部でも物凄く小さなAABBを大量に生成して衝突判定を行っている実装も多い。
== 備考 実装例 ===== PreserveContentsは遅い ===PreserveContentsは[[VRAMMonoGame]]容量が少ない環境ではでの実装例。[[メインメモリデバッグ]]への保存と復元が発生するため絶望的なほど遅くなる。はしていない。<source lang="csharp">[[PC]]ではまず問題になることはないようだが、一部の[[スマホ]]では絶望的な速度になるようだ。 using System;なるべくDiscardContentsを使ったほうが良さそうだ。 using Microsoft.Xna.Framework;
=== DiscardContentsの注意点 === // FromとToを結ぶ立方体GraphicsDeviceが最初から持っているレンダリングターゲット(DirectXでいうプライマリサーフェイス)に相当するものはDiscardContentsに設定されている。 public struct AABBDiscardContentsの欠点はGraphicsDevice.SetRenderTargetするたびに破棄される点であり、レンダリング系APIの呼出順序を間違えると残念なことになる。 { public Vector3 From; public Vector3 To;
たとば以下のコードは正常に動作しない。<source lang="csharp"> protected override void Draw(GameTime gameTime)public Vector3 Center
{
// (1)プライマリサーフェイスを塗りつぶすget _graphics{ return this.GraphicsDeviceFrom + this.Clear(Color.CornflowerBlue)Harf; } }
public Vector3 Harf { // (2)レンダリングターゲットを切り替えるget _graphics{ return this.GraphicsDeviceWidth * 0.SetRenderTarget(new RenderTarget2D(GraphicsDevice, 128, 128))5f; } }
public Vector3 Width { // (3)レンダリングターゲットをプライマリサーフェイスに戻すget // このときプライマリサーフェイスはDiscardContents設定なので内容がクリアされ(1)の塗りつぶしが無かったことにされる。{ _graphics return this.GraphicsDeviceTo - this.SetRenderTarget(null)From; } }
public AABB(Vector3 from, Vector3 to) { this.From = new Vector3(Math.Min(from.X, to.X), Math.Min(from.Y, to.Y), Math.Min(from.Z, to.Z)); basethis.To = new Vector3(Math.Max(from.X, to.X), Math.DrawMax(gameTimefrom.Y, to.Y), Math.Max(from.Z, to.Z));
}
</source>
DiscardContentsの場合は以下のような呼出順序で書かなければならない。<source lang="csharp"> protected override void Drawpublic bool Contains(GameTime gameTimeAABB target)
{
// (1)レンダリングターゲットを切り替える _graphicsif ((this.Harf.X + target.Harf.GraphicsDeviceX) < Math.SetRenderTargetAbs(new RenderTarget2D(GraphicsDevice, 128, 128this.Center.X - target.Center.X))return false// (2)レンダリングターゲットをプライマリサーフェイスに戻す(と同時にまっさらになる) _graphicsif ((this.Harf.Y + target.Harf.GraphicsDeviceY) < Math.SetRenderTargetAbs(nullthis.Center.Y - target.Center.Y)) return false// (3)プライマリサーフェイスを塗りつぶす _graphicsif ((this.Harf.Z + target.Harf.GraphicsDeviceZ) < Math.ClearAbs(Colorthis.CornflowerBlueCenter.Z - target.Center.Z))return false;
base.Draw(gameTime)return true;
}
}
</source>
== 関連項目 ==
* [[MonoGame/クラスライブラリ/GraphicsDeviceクラス|GraphicsDeviceクラス]]** [[MonoGame/クラスライブラリ/GraphicsDeviceクラス/SetRenderTargetメソッド|SetRenderTargetメソッド]]** [[MonoGame/クラスライブラリ/GraphicsDeviceクラス/SetRenderTargetsメソッド|SetRenderTargetsメソッド]]** [[MonoGame/クラスライブラリ/GraphicsDeviceクラス/GetRenderTargetsメソッド|GetRenderTargetsメソッド]]* [[MonoGame/クラスライブラリ/RenderTarget2Dクラス|RenderTarget2Dクラス]]* [[MonoGame/クラスライブラリ/RenderTargetCubeクラス|RenderTargetCubeクラス]]* [[MonoGame/クラスライブラリ/CubeMapFace列挙体|CubeMapFace列挙体物理演算エンジン]]* [[MonoGame/クラスライブラリ/RenderTargetBinding構造体|RenderTargetBinding構造体衝突判定]]
[[category: MonoGame3DCG]]
匿名利用者

案内メニュー