美文网首页
Three.js 剖切 clippingPlan

Three.js 剖切 clippingPlan

作者: 百思不得Ting姐 | 来源:发表于2020-09-12 17:43 被阅读0次

对模型剖切是通过设置scene或者material的clippingPlanes实现的;
如果设置了材质的clippingPlanes,shader的顶点着色器和片元着色器都会加入相应逻辑的代码;
1、首先在顶点着色器里加入以下代码,给vClipPosition赋值,并传入片元着色器,这里用的是相机坐标系里的值,没有用世界坐标系里的值,这可能是因为变换矩阵可能改变法线的朝向,因此要将法线和顶点都统一到相机坐标系里;

#if 1 > 0 
  vClipPosition = -mvPosition.xyz;
#endif

if语句里的1表示的是clippingPlanes的个数,编译shader之前会被动态替换;
2、到片元着色器里,有如下逻辑:

#if 1 > 0
    vec4 plane;
    
        plane = clippingPlanes[ 0 ];
        if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;
    
    #if 1 < 1
        bool clipped = true;
        
        if ( clipped ) discard;
    #endif
#endif

同样道理,里边有些固定数值,其实是在shader编译之前动态替换的;上述代码主要是判断点落在了平面的哪一测,如果不在指定的一侧,就discard,不绘制;

Three.js里的Plane用的是Hessian Normal Form

image.png
来描述一个明面,特别要注意,Plane的构造方法里,传入的距离是带符号的,正值表示圆点位于法线方向指向的那一侧,负值表示另一侧,见下图:
image.png
image.png

注意:上面顶点着色器里,vClipPosition = -mvPosition.xyz,之所以有个负号,也是从上面Hessian Normal Form表达式得出的,NX = -P => -NX = P => N*(-X)=P,P是有符号的距离。在片元着色器里 dot( vClipPosition, plane.xyz ) > plane.w,plane.xyz和plane.w都是经过法线矩阵变换后的值,不是构造Plane时候传入的。

相关文章

  • Three.js 剖切 clippingPlan

    对模型剖切是通过设置scene或者material的clippingPlanes实现的;如果设置了材质的clipp...

  • BIM学习建模–剖切框

    在视图处能看到剖切框,用于创建剖面视图,剖切后拉一条线,在箭头文字处双击能够直接跳入剖面视图。 第二点,剖切线有个...

  • THREE.js_的使用(例子)

    THREE.js 下载 THREE.js 官方文档 THREE.js 中文基础教程 THREE.MeshLine ...

  • Three.js

    Three.js 1. 概述 1.1 什么是Three.js Three.js是一个3D javascript库。...

  • Three.js 之初级入门

    #. 前言 Three.js[https://github.com/mrdoob/three.js] 是基于原生 ...

  • three.js 的网站连接

    three.js 官网 https://threejs.org/ three.js 官方例子 threejs.or...

  • three.js 3D动画效果

    three.js

  • Three.js 实现VR看房

    准备工作: 1、three.js https://threejs.org/build/three.js 2、搭建项...

  • 3月22工作总结

    1:兽医诊断135模式,剖检:怎么剖,实验室怎么操作。 2:剖:死亡,发病,亚健康。剖检多少,怎么剖! 3:实验室...

  • vue+three.js开发

    Three.js Examples在vue-cli3中使用three.js的OBJLoader和MTLLoader...

网友评论

      本文标题:Three.js 剖切 clippingPlan

      本文链接:https://www.haomeiwen.com/subject/tpvwektx.html