少なくともを非常に簡単にしようとするとpart 1 of the Lighthouse3D Radar Frustum Culling tutorialが動作します...そして、私はレンダラーでその部分を動作させることさえできないということは絶対に戸惑います。Frustum Cullingへの「レーダーアプローチ」:最初の簡単なテストで失敗しますか?
最初のステップは、ポイントがニアプレーンの前か遠いプレーンの後ろにあるかどうかをテストし、そうであれば早起きすることです。
私は2x2立方体のワールドスペースセンター(x1y2z3)を使用し、私は動き回ることができるカメラを持っています自由に回転できます。レンダラーがうまくいくので、私のベクトルと行列のすべてのものはかなり強固でなければなりません。そこでここでは、この最初の部分の(ゴーで)私の感想だ、テスト、単純な「遠近または-VS Z」:
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の向きが逆転されているため、図の参照は右手系(OpenGLのように)ではないことに注意してください」 - GLチュートリアルもちろん、これとは逆の効果があります...
上記のようにZを逆にすると、それは時間の約50%を超えるはずです。私がしなければ、それは時間の約98%を「過度に罵倒する」..
何が欠けていますか?
私はすべての_z_座標が同じように作用するはずです。 (例えば、v.zもミラーリングされるべきです) –
'cam.Controller.dir'とは - 視線(カメラが向いているベクトル)ですか?もしそうなら、あなたはzを否定したくありません。カメラとポイントの両方がワールド座標系(つまり、すべての変換(たとえば、平行移動、スケールなど)が適用されている)であると仮定すると、Zの否定とは別に、残りの計算は妥当です。 Zを反転するとドットプロダクトがマイナスになります。近似値と遠い値が正の値であれば、ほぼすべてのポイントが選択されてしまうようです。 – radical7