ユーザー定義のクリッピングプレーンを使用したいのですが。
openGLでは私は使用します:
glClipPlane(GL_CLIP_PLANE0, planeEq);
glEnable(GL_CLIP_PLANE0);
どうすればwebGLで同じことができますか?
renderer.context
WebGLコンテキストを取得できるはずです。
そこからそれはあなたとWebGL仕様次第です:)
私は最近、反射する平らな面(別名「ミラー」:smile :)をthree.jsに実装しているときに同じ問題に遭遇しました
私の知る限り、WebGLでユーザー定義のクリッピングプレーンを作成することはできません。少なくとも、説明した「単純な」openGLの方法ではできません。
秘訣は、この論文で説明されている「斜位錐台」法を使用することです: http ://www.terathon.com/lengyel/Lengyel-Oblique.pdf
この方法の目的は、ミラーリングされたカメラ錐台のクリップに近い平面を、反射面によって定義された平面に置き換えることです。
いくつかのソースコードも提供されています(C ++でも): http :
私はそのメソッドをthree.jsに正常に移植しました。これは、このライブを表示するためのサンプルシーンです: http ://jsfiddle.net/slayvin/PT32b/
残っている唯一の問題は、renderTargetがフレームの後ろにレンダリングされることであり、その理由がわかりません。 これにより、カメラの動きが速すぎる場合や、ミラーが他のオブジェクトを通過している場合に、ちらつきが発生します。
これを修正する方法について何かアイデアはありますか? 一種のマルチバッファリングメソッドを実装する必要がありますか、それとも錐台を変更した後にカメラマトリックスを更新しないという理由だけですか? もしそうなら、どうすればそれを行うことができますか?
うーん... scene.autoUpdate
をfalse
、 scene.updateMatrixWorld()
を手動で呼び出して、すべてのレンダラーが同じものを持っていることを確認しようとしましたが、何も解決されていないようです...そこからローテーションを抽出する前にmirror.updateMatrix()
呼び出さないでください...
でもかなりかっこいい! たぶん、これをそれ自身のオブジェクトに抽象化することができます。
甘い。
また、関連するマトリックスが最新であることを確認してみました。 ラグが気になる場合は、使用する前に更新する必要があります。 残念ながら、すばやくズームしても問題はないようです...
mirror.updateMatrixWorld();
camera.updateMatrixWorld();
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
どうもありがとう!
あなたの提案は私に問題を再考させました、そして私は「一般的な」遅れがなく、近くのクリップ面が変わるときだけちらつくことに気づきました(ミラーリングされたカメラ位置と比較したミラー位置)。
つまり、 @ WestLangleyはほぼそこにあり
結果:「ラグ」はもうありません: http :
たぶん、これをそれ自身のオブジェクトに抽象化することができます。
はい、私はそれについて考えました。 すべてを処理するnew THREE.mirror()
と便利です。 何かをコーディングしてみます...
最も参考になるコメント
どうもありがとう!
あなたの提案は私に問題を再考させました、そして私は「一般的な」遅れがなく、近くのクリップ面が変わるときだけちらつくことに気づきました(ミラーリングされたカメラ位置と比較したミラー位置)。
つまり、 @ WestLangleyはほぼそこにあり
結果:「ラグ」はもうありません: http :
はい、私はそれについて考えました。 すべてを処理する
new THREE.mirror()
と便利です。 何かをコーディングしてみます...