少なくとも、Lighthouse3D Radar Frustum Culling チュートリアルの非常に単純な パート 1 を機能させようとしています...そして、その部分を自分のレンダラーで機能させることさえできないことに完全に困惑しています。
したがって、最初のステップは次のとおりです。ポイントがニアプレーンの前にあるかファープレーンの後ろにあるかをテストし、そうであれば早期カリングします。(そうでない場合は、さらにテストを実行しますが、最初の部分だけで行き詰まっています。)
2x2 の立方体のワールド空間の中心 (x1y2z3) を使用し、自由に移動および回転できるカメラを持っています。レンダラーはそれ以外の場合は問題なく動作するため、すべてのベクターとマトリックスのものはかなりしっかりしている必要があります。したがって、この最初の部分である単純な「Z vs Near-or-far」テストの (Go での) 私の見解は次のとおりです。
func (cam *Camera) frustumHasPoint(point *Vec3) bool {
var pc Vec3
v := point.Sub(&cam.Controller.Pos) // point minus camPos
ref := cam.Controller.dir // take a copy of camDir
ref.Z = -ref.Z
ref.Normalize() // camDir was already normalized but anyway...
pc.Z = v.Dot(&ref)
if pc.Z > cam.Perspective.ZFar || pc.Z < cam.Perspective.ZNear {
return false
}
return true
}
では、なぜ ref の Z を逆にするのでしょうか? チュートリアルでは、彼らは次のように書いているからです。もちろんこれは逆効果ですが…
上記のように Z を反転すると、約 50% の確率で必要以上にカリングされます。そうしないと、約 98% の確率で「過剰選別」されます。
何が欠けていますか?