我试图与三家公司的剪裁机合作,我没有读过Material.clipIntersection的描述,只是盲目地把它理解为“已启用裁剪”。
在阅读了描述、播放示例和深入研究代码之后,我得出结论,没有任何参数可以控制是否启用了裁剪。唯一的两个接口是:
.clippingPlanes[]
.clipIntersection
也许是Renderer.localClippingEnabled,但我不想在全局上启用/禁用.本地剪裁。即。如果我有两种材料,我想把它控制在一种上。
问题似乎是clippingPlanes定义了NUM_CLIPPING_PLANES
'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,我可以看到,WebGLClipping还有更多的事情要做。尽管如此,我还是对这个定义感到困惑,我想知道每次添加/删除剪贴板时是否需要更新这些材料。
tl:dr;
是否有内置的方式可以轻松地添加切换以启用/禁用此示例的剪辑:intersection,,而无需重新编译着色器
发布于 2017-11-06 21:35:35
可能不符合问题的精神,但简单的解决方案是用空数组替换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,这都是“自动”。在setProgram期间,WebGLRenderer设置一个名为_clippingEnabled的变量。这是根据来自WebGLClipping.init的返回值来设置的,其中一种情况检查材料的clippingPlanes属性中是否有任何值。
WebGLClipping有以下一行:
uniform = { value: null, needsUpdate: false };将_clippingEnabled设置为true和clippingPlanes属性中的一些值后,进程将进入projectPlanes of WebGLClipping,其中包括行:
uniform.needsUpdate = true;轰隆隆。制服被标记为自动更新。
https://stackoverflow.com/questions/47145220
复制相似问题