利用ai生成深度图后实现图片跟随鼠标实现3D效果

实现原理

利用three.js根据深度图来控制不同深度位置像素位移距离不同,营造3D效果。

 

前期准备

深度图生成网站 LeiaPix Converter

注册登录完成后

第一步点击upload上传你的图片(建议不要上传带有人物或者较为模糊的图片,不然效果可能会造成人物变形)

 

 

 

 

 

第二步点击分享选择深度图下载

 

 

 

 

 

第三步在你的项目中引入three.js(各个框架不同,这里以静态页为例)

 

下载three.js 并引入项目

three.js github Releases · mrdoob/three.js (github.com) (这里我下载的最新版)

 

准备好这些后就可以开始激情撸代码了

 

 

 
<script>

    const scene = new THREE.Scene();

    /*相机*/
    const camera = new THREE.PerspectiveCamera(
        90,
        window.innerWidth / window.innerHeight,
        0.1,
        1000
    );
    camera.position.set(0, 0, 6);

    /*渲染器*/
    let renderer = new THREE.WebGLRenderer({ antialias: true });
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);//向body内添加


    /*加载纹理*/
    const textureLoader = new THREE.TextureLoader();
    const texture = textureLoader.load('/images/3d_img.jpg');//加载图片本身
    const dapthTexture = textureLoader.load('/images/3dimg.jpg');//加载深度图

    /*鼠标坐标2维向量*/
    const mouse = new THREE.Vector2();

    /*创建平面*/
    const geometry = new THREE.PlaneGeometry(16, 9);

    /*着色器材质*/
    const material = new THREE.ShaderMaterial({
        uniforms: {
            uTexture: { value: texture },
            uDepthTexture: { value: dapthTexture },
            uMouse: { value: mouse },
        },
        vertexShader: `
            varying vec2 vUv;
            void main() {
                vUv = uv;
                gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
            }
        `,
        fragmentShader: `
            uniform sampler2D uTexture;
            uniform  sampler2D uDepthTexture;
            uniform vec2  uMouse;
            varying vec2 vUv;
            void main() {
                vec4 color = texture2D(uTexture, vUv);
                vec4 depth = texture2D(uDepthTexture, vUv);
                float depthValue = depth.r;
                float x = vUv.x + uMouse.x*0.01*depthValue;
                float y = vUv.y + uMouse.y*0.01*depthValue;
                vec4 newColor = texture2D(uTexture,vec2(x,y));
                gl_FragColor = newColor;
            }
            `,
    });

    const plane = new THREE.Mesh(geometry, material);
    scene.add(plane);


    /*渲染*/
    requestAnimationFrame(function animate() {
        material.uniforms.uMouse.value = mouse;
        requestAnimationFrame(animate);
        renderer.render(scene, camera);
    });


    /*监听鼠标计算位移量*/
    window.addEventListener('mousemove', (event) => {
        mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
        mouse.y = (event.clientY / window.innerHeight) * 2 - 1;
    })
</script>
 

 

自此就可以看到效果了

 

本文作者:异·类

本文链接:https://www.cnblogs.com/yilei-zero/p/17202424.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @ 2023-03-10 10:03  异·类  阅读(619)  评论(1编辑  收藏  举报