javascript - 如何将剪切面渲染为实体对象

标签 javascript 3d three.js shader clip

在 Three.js 中,我有一个 3d 对象,我在其中使用局部剪切平面来仅渲染对象的一部分。

但是,由于 3d 对象是“空心的”(意味着只有外表面被渲染),当我们从该表面剪下任何东西时,我们可以“看到”对象。这是我的意思的一个例子,clipping a corner off a cube .请注意我们如何看到对 Angular 的背面

我想赋予物体实体的外观。基于this issue ,似乎实现此目的的最佳方法是在剪切区域上创建一个表面,从而盖住孔并使对象看起来不像是空心的。

我的问题是,我怎么知道在哪里构建这个表面? Three.js 是否提供了一种方法来获取在平面和任意表面之间相交的顶点列表?如果没有,我自己该如何解决这个问题?

我找到了 this question ,但作者没有描述他们是如何解决我在这里遇到的问题的。

最佳答案

您想将裁剪表面渲染成实体一样——即,不是空心的。

您可以使用 MeshPhongMaterial 或与此相关的任何 three.js Material 来实现这种效果,只需对 Material 着色器进行简单的修改即可。

material.onBeforeCompile = function( shader ) {

    shader.fragmentShader = shader.fragmentShader.replace(

        '#include <output_fragment>',

        `
        vec3 backfaceColor = vec3( 0.4, 0.4, 0.4 );
        gl_FragColor = ( gl_FrontFacing ) ? vec4( outgoingLight, diffuseColor.a ) : vec4( backfaceColor, opacity );
        `
    )
};

这应该看起来不错。它将需要 material.side = THREE.DoubleSide;

clipped torus

或者,参见 https://threejs.org/examples/webgl_clipping_stencil.html .

three.js r.148

关于javascript - 如何将剪切面渲染为实体对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37090942/

相关文章:

java - 从数组列表动态创建复选框java

javascript - 使用 JavaScript(JS 颜色库)更改 SVG 路径的颜色

javascript - 为什么使用 MUI Button 的自定义 Button 组件在使用 Tooltip 悬停时不起作用?

algorithm - 深度排序矩形多边形,模型轴的所有部分朝向

javascript - Highcharts 3D 饼图颜色渲染

javascript - Three.js 阴影贴图 - Shadow.camera 未定义

javascript - 如何让 Three.js Sprite 背景混合?

javascript - 正则表达式 - 匹配字符串中的任何数字

css - 在鼠标移动时更改透视角度/原点 3d-css

javascript - 我如何在三个js中迭代场景子项