Autodesk forge 使剖切面与ForgeViewer中的自定义网格一起工作

Autodesk forge 使剖切面与ForgeViewer中的自定义网格一起工作,autodesk-forge,autodesk-viewer,Autodesk Forge,Autodesk Viewer,我正在使用Autodesk的ForgeViewer加载IFC文件和自定义THREE.js网格,类似于所做的操作 我遇到的问题是,剖切面()不影响自定义网格,只影响锻造模型。有什么方法可以让剖切面也在自定义网格上工作吗 如果我没有弄错的话,r71版本中还没有引入THREE.js设置clippingPlanes的方法(Forge的自定义实现基于此),但也许有一种Forge特定的方法可以实现这一点?没错,Forge Viewer使用自己的基于着色器的剪辑。有关更多详细信息,请参见我的另一个(尤其是这个

我正在使用Autodesk的ForgeViewer加载IFC文件和自定义THREE.js网格,类似于所做的操作

我遇到的问题是,剖切面()不影响自定义网格,只影响锻造模型。有什么方法可以让剖切面也在自定义网格上工作吗


如果我没有弄错的话,r71版本中还没有引入THREE.js设置
clippingPlanes
的方法(Forge的自定义实现基于此),但也许有一种Forge特定的方法可以实现这一点?

没错,Forge Viewer使用自己的基于着色器的剪辑。有关更多详细信息,请参见我的另一个(尤其是这个)。

扩展Petr的答案,以下是支持纹理网格剖切面所需的代码:

const imgTexture = THREE_FORGE.ImageUtils.loadTexture(textureUrl);

const vertexShader = `
  #if NUM_CUTPLANES > 0
      varying vec3 vWorldPosition;
  #endif
  varying vec2 vUv;
  void main() {
      #if NUM_CUTPLANES > 0
          vec4 _worldPosition = modelMatrix * vec4( position, 1.0 );
          vWorldPosition = _worldPosition.xyz;
      #endif
      vUv = uv;
      gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
  }
`;

const fragmentShader = `
  #include<cutplanes>
  #if NUM_CUTPLANES > 0
      varying highp vec3 vWorldPosition;
  #endif
  uniform sampler2D texture;
  varying vec2 vUv;
  void main() {
      #if NUM_CUTPLANES > 0
          checkCutPlanes(vWorldPosition);
      #endif
      gl_FragColor = texture2D(texture, vUv);
  }
`;

const material = new THREE_FORGE.ShaderMaterial({
    uniforms: {
        cutplanes: {type: 'v4v', value: []},
        hatchParams: {type: 'v2', value: new THREE_FORGE.Vector2(1.0, 10.0)},
        hatchTintColor: {type: 'c', value: new THREE_FORGE.Color(0xFFFFFF)},
        hatchTintIntensity: {type: 'f', value: 1.0},
        texture: {type: 't', value: imgTexture},
    },
    vertexShader: vertexShader,
    fragmentShader: fragmentShader,
});

const mesh = new THREE.Mesh(geometry, material);
const imgTexture=THREE_FORGE.ImageUtils.loadTexture(textureUrl);
常量顶点着色器=`
#如果NUM_剖切面>0
可变vec3位置;
#恩迪夫
可变vec2 vUv;
void main(){
#如果NUM_剖切面>0
vec4 _worldPosition=modelMatrix*vec4(位置,1.0);
vWorldPosition=_worldPosition.xyz;
#恩迪夫
vUv=紫外线;
gl_位置=projectionMatrix*modelViewMatrix*vec4(位置,1.0);
}
`;
常量碎片着色器=`
#包括
#如果NUM_剖切面>0
可变的高电压矢量位置;
#恩迪夫
二维纹理均匀;
可变vec2 vUv;
void main(){
#如果NUM_剖切面>0
检查剖切面(位置);
#恩迪夫
gl_FragColor=纹理2D(纹理,vUv);
}
`;
const material=新的三层锻造材质({
制服:{
剖切面:{type:'v4v',值:[]},
hatchParams:{type:'v2',value:new THREE_FORGE.Vector2(1.0,10.0)},
HatchIntColor:{type:'c',value:new THREE_FORGE.Color(0xFFFFFF)},
HatchIntentintensity:{type:'f',value:1.0},
纹理:{type:'t',value:imgTexture},
},
vertexShader:vertexShader,
fragmentShader:fragmentShader,
});
常量网格=新的三个网格(几何体、材质);