我正在尝试使用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,无需重新编译着色器?
答案 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;
动臂。制服被标记为自动更新。