总要有人来改变世界的,为什么不能是你呢

geometry clip 的实现

前天晚上,鲫鱼大佬在群里发了一段3D引擎的效果视频,其中有一个效果就是clip,我当时想着clip应该算点到面的距离也能做吧,就顺口问了一下,鲫鱼大佬说:

 顺着这个思路想了一下,确实,用点积的话,更容易判断左右两边,于是刷刷刷写了一个demo,奉上代码:

    const geometry = new THREE.BoxGeometry( 10, 10, 10 );
    var mat = new THREE.ShaderMaterial({
        uniforms: {},
        defaultAttributeValues : {},
        vertexShader: `
            varying float flag; 

            void main(){
                float a = 3.141592653589 / 4.0;
                vec3 axis = vec3(1.0,0.0,0.0);
                mat3 rMat= mat3(
                    cos(a), -sin(a), 0.0,
                    sin(a), cos(a), 0.0,
                    0.0, 0.0, 1.0
                );
                flag = dot(vec3(position.x - 5.0,position.yz),rMat * axis);
                gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
            }
        `,
        fragmentShader: `
            varying float flag; 

            void main(){
                if(flag > 0.0){
                    discard;
                }
                gl_FragColor = vec4(1.0,1.0,1.0,0.5);
            }
        `,
        transparent: true,
        side:THREE.DoubleSide,
        depthTest:true,
        depthWrite:false,
    });
    const cube = new THREE.Mesh( geometry, mat );
    cube.position.y = 20;
    scene.add( cube );

效果:

 立方体是10*10*10的,从上述代码不难看出,我将这个剪裁面旋转了π/4度,并且x轴平移5个单位,于是得到了上图的效果。

 

 

我觉得掌握原理比掌握API更重要,这也是图形学的乐趣所在吧。

网上还有用模版缓冲实现的方法,以后有空再看看模版缓冲能实现哪些好玩的东西吧

 

posted @ 2020-11-22 23:13  桔子桑  阅读(449)  评论(0编辑  收藏  举报