启用/禁用每种材料的剪裁(r87)

时间:2017-11-06 20:29:05

标签: three.js

我正在尝试使用THREE的剪裁平面,我没有阅读Material.clipIntersection的描述,只是盲目地将其视为“启用剪辑”。

阅读完描述后,玩这个例子并挖掘代码我得出结论,没有参数可以控制是否启用限幅。只有两个接口是:

.clippingPlanes[]

.clipIntersection

也许Renderer.localClippingEnabled但我不想全局启用/禁用...本地剪辑。 IE浏览器。如果我有两种材料,我希望能够控制它。

问题似乎是clippingPlanes定义NUM_CLIPPING_PLANES

'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,

我可以看到WebGLClipping还有更多内容。我仍然对定义感到困惑,我想知道每次添加/删除剪裁平面时是否需要更新材料。

TL:博士;

是否有内置方法可以轻松添加切换以启用/禁用此示例的裁剪: https://threejs.org/examples/#webgl_clipping_intersection无需重新编译着色器

1 个答案:

答案 0 :(得分:0)

可能不符合您的问题,但简单的解决方案是用空数组替换clippingPlanes属性。

我在示例中更改/添加了以下代码:

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

...

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 = [];

...

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,它全部&#34;自动化&#34;。 setProgram期间的每次渲染,WebGLRenderer都会设置一个名为_clippingEnabled的变量。这是根据WebGLClipping.init的返回值设置的,其中一个案例检查材料是否在其clippingPlanes属性中有任何值。

WebGLClipping包含以下内容:

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

_clippingEnabled设置为true,以及clippingPlanes属性中的某些值,该流程会进入projectPlanes WebGLClipping,其中包括行:

uniform.needsUpdate = true;

动臂。制服被标记为自动更新。