首页 > 其他 > 详细

geometry clip 的实现

时间:2020-11-23 00:25:22      阅读:30      评论:0      收藏:0      [点我收藏+]

前天晚上,鲫鱼大佬在群里发了一段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更重要,这也是图形学的乐趣所在吧。

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

 

geometry clip 的实现

原文:https://www.cnblogs.com/eco-just/p/14022222.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!