Заставить срезанные плоскости работать с пользовательскими сетками в ForgeViewer - PullRequest
0 голосов
/ 03 января 2019

Я использую FordesViewer от Autodesk для загрузки как файлов IFC, так и пользовательских сеток THREE.js, аналогично тому, что делается здесь

Проблема, с которой я столкнулся, заключается в том, что плоскости среза ( см., Например, здесь ) не влияют на пользовательские сетки, только на модели Forge. Есть ли способ, как я могу заставить срезы работать на пользовательских сетках?

Если я не ошибаюсь, способ установки clippingPlanes в THREE.js еще не был представлен в версии r71 (на которой основана пользовательская реализация Forge), но, возможно, есть специальный способ заставить эту работу работать на Forge?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Расширяя ответ Петра, вот код, необходимый для поддержки плоскостей среза для текстурированных сеток:

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);
0 голосов
/ 03 января 2019

Вы правы, Forge Viewer использует собственное обрезание на основе шейдеров.См. Мой другой ответ (особенно этот гист ) для получения более подробной информации.

...