2017-11-06 11 views
0

私はTHREEのクリッピングプレーンで作業しようとしていますが、Material.clipIntersectionの説明を読んでいませんでした。素材ごとに切り抜きを有効/無効にする(r87)

例を読み、コードを掘り下げて、クリッピングを有効にするかどうかを制御するパラメータがないと判断しました。唯一の2つのインタフェースがある:

.clippingPlanes[]

.clipIntersection

そしておそらくRenderer.localClippingEnabledが、私は...地元のクリッピングを有効/無効にグローバルにしたくありません。つまり私は2つの材料を持っている場合、私は1つでそれを制御できるようにしたいと思います。

'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, 

を私はWebGLClippingで起こって多くのものがあることがわかります。

問題はclippingPlanesNUM_CLIPPING_PLANESを定義していることのようです。それでも私は定義に混乱しています。クリッピング面を追加/削除するたびに材料を更新する必要があるかどうか疑問に思っています。

tl:dr;

は、簡単にこの例にクリッピングを有効/無効にするトグルを追加する方法で構築あり: https://threejs.org/examples/#webgl_clipping_intersectionシェーダを再コンパイルせず?

+1

'mesh.material.clippingPlanes [0] .constant = BigNumber; 'を設定すると、クリッピングを無効にするのと同じ効果があります。 – WestLangley

+0

これはもう一つの考えです。これは、制服のクリッピングロジックの前にifチェックがあるのと同じくらい速いのかどうか分かりますか? – pailhead

答えて

0

恐らくあなたの質問の精神ではありませんが、簡単な解決策は、clippingPlanesプロパティを空の配列に置き換えることです。

私が例に次のコードを追加/変更:ボックスをチェックしています...

var clipPlanes = [ 
    new THREE.Plane(new THREE.Vector3(1, 0, 0), 0), 
    new THREE.Plane(new THREE.Vector3(0, - 1, 0), 0), 
    new THREE.Plane(new THREE.Vector3(0, 0, - 1), 0) 
]; 
var clipPlanesOff = []; 

...

var params = { 
    clipPlanesOn: true, 
    clipIntersection: true, 
    planeConstant: 0, 
    showHelpers: false 
}; 

gui.add(params, 'clipPlanesOn').name('clip planes on').onChange(function (value) { 

    var children = group.children; 

    for (var i = 0; i < children.length; i ++) { 

     children[ i ].material.clippingPlanes = (value) ? clipPlanes : clipPlanesOff; 

    } 

    render(); 

}); 

は/にクリッピングをオンオフ。詳細と

更新:

AFAICT、それはすべての "オートマジック" です。 setProgramの間に各レンダリング、と呼ばれる変数をWebGLRendererに設定します。これはWebGLClipping.initの戻り値に基づいて設定されます。ケースの1つでは、マテリアルのclippingPlanesプロパティに値があるかどうかがチェックされます。

WebGLClipping次の行があります_clippingEnabledtrueに設定し、clippingPlanesプロパティの一部の値を用いて

uniform = { value: null, needsUpdate: false }; 

を、プロセスラインを含む、WebGLClippingprojectPlanesにその方法を行う:

uniform.needsUpdate = true; 

ブーム。ユニフォームは、自動更新のためにフラグが立てられています。

+0

頭の上から外して、これがどのように機能するか知っていますか?自動的に 'needsUpdate'をどこかに設定していますか?これは私がその配列から追加/削除することによって意味されたものです。これは無効にすることができますが、私はGLSLで '#define ... 'を実行するという事実によって脅かされます。 'onBeforeCompile'を使ってユニフォームとifチェックを追加するとパフォーマンスが賢明にならないかどうか、また、素材の2つの異なるバージョン間を切り替えるほうが良いでしょうか? – pailhead

+0

答えを更新しました。 TL; DR:それはオートマティックです! – TheJim01

関連する問題