float CalculateFarClipDistance(ref Matrix view, ref BoundingBox sceneBox, float nearClipDistance)
{
// シーン AABB の頂点の中で最もカメラから遠い点の z 値を探す。
float maxFarZ = 0.0f;
sceneBox.GetCorners(corners);
for (int i = 0; i < corners.Length; i++)
{
// z についてのみビュー座標へ変換。
float z =
corners[i].X * view.M13 +
corners[i].Y * view.M23 +
corners[i].Z * view.M33 +
view.M43;
// より小さな値がより遠くの点。
if (z < maxFarZ) maxFarZ = z;
}
// maxFarZ の符号を反転させて距離を算出。
return nearClipDistance - maxFarZ;
}