three.js背景图用视频纹理

本文介绍了一个使用Three.js创建的3D场景应用案例,通过加载不同的3D模型和纹理实现了一个抢红包的游戏场景。该场景中包括了动态背景、多个3D模型以及平面红包元素,所有元素都在场景中动态移动,提供了丰富的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>抢红包</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
    </style>
</head>
<body>
</body>
<script src="./js/three.js"></script>
<script src="./js/loaders/GLTFLoader.js"></script>
<script>
    var winWidth = window.innerWidth,winHeight = window.innerHeight;
    var scene = new THREE.Scene();
    var gltfLoader = new GLTFLoader(),textureLoader = new THREE.TextureLoader();
    var bg = textureLoader.load('./bg.jpg');
    scene.background = bg;
    // var camera = new THREE.PerspectiveCamera(75,winWidth / winHeight,0.1, 100);
    // camera.position.set(0,0,10);
    // camera.lookAt(new THREE.Vector3(0,0,0));
    var camera = new THREE.OrthographicCamera(winWidth / -2, winWidth / 2, winHeight / 2, winHeight/-2, 0.001,5000);
    scene.add(new THREE.AmbientLight(0xffffff, 1));
    var models = [];
    var moneys = [];

    gltfLoader.load('./models/denglong_2022_3.gltf', (obj) => {
        let m = obj.scene;
        // m.scale.set(5,5,5);
        m.scale.set(500,500,500);
        addModel(m, 20, 'model');
    });
    gltfLoader.load('./models/denglong2022_A.gltf', (obj) => {
        let m = obj.scene;
        m.position.set(4,0,0)
        // m.scale.set(20,20,20);
        m.scale.set(2000,2000,2000);
        addModel(m, 20, 'model');
    });

    function addModel(m,num,type){
        for(let i = 0; i < num; i++) {
            let nm = m.clone();
            // let x = Math.random() * 40 - 20;
            // let y = Math.random() * 20 - 15;
            // let z = -Math.random() * 10;
              let x = Math.random() * 4000 - 2000;
              let y = Math.random() * 2000 - 1500;
              let z = -(Math.random() * 4000 + 400);// 正交相机z值不论怎么设置大小都没区别,不过会影响模型的重叠时的显示前后层级
              nm.position.set(x,y,z);
            if (type === 'model') {
                let s = (Math.random() * 500 + 500);
                nm.scale.set(s,s,s);
                models.push(nm);
            } else {
                let s = Math.random()*0.5 + 0.5;
                nm.scale.set(s,s,s);
                moneys.push(nm);
            }
            scene.add(nm);
            
        }
        // console.log('mPos', JSON.stringify(mPos))
    }
    createMoney()
    function createMoney(){
        var p1 = new THREE.PlaneGeometry(100,140,1);
        var t1 = textureLoader.load('https://houtaicdn.alva.com.cn/medias/resources/wechat/arread/activity/teec2/hongbao1.png');
        var mat1 = new THREE.MeshBasicMaterial({map: t1})
        var m1 = new THREE.Mesh(p1,mat1);
        addModel(m1, 20, 'money');

        var p2 = new THREE.PlaneGeometry(100,140,1);
        var t2 = textureLoader.load('https://houtaicdn.alva.com.cn/medias/resources/wechat/arread/activity/teec2/hongbao2.png');
        var mat2 = new THREE.MeshBasicMaterial({map: t1})
        var m2 = new THREE.Mesh(p1,mat1);
        addModel(m2, 20, 'money');
    }

    // vdBg();
    function vdBg(){
        function setVideoStyle(elem) {
            elem.style.position = "absolute";
            elem.style.top = 0;
            elem.style.left = 0;
            elem.width = winWidth;
            elem.height = winHeight;
            // elem.classList.add('.camera-style');
        }
        var vd = document.createElement('video');
        vd.setAttribute('autoplay','');
        vd.setAttribute('muted','');
        vd.setAttribute('playsinline','');
        setVideoStyle(vd);
        document.body.appendChild(vd)

        navigator.mediaDevices.getUserMedia({
            audio: false,
            video: {
                width: {ideal: winWidth},
                height: {ideal: winHeight},
                aspectRatio: {ideal: winWidth / winHeight},
                facingMode: 'environment'
            }
        }).then(stream => {
            vd.srcObject = stream;
            vd.onloadedmetadata = e => {
                vd.play();
                var vdCanvas = new THREE.VideoTexture(vd);
                scene.background = vdCanvas;
            }
        }).catch(err => {
        })

    }

    var renderer = new THREE.WebGLRenderer({
        antialias: true,
        alpha: true,
        // preserveDrawingBuffer: true
    });
    renderer.setSize(winWidth,winHeight);
    renderer.domElement.style.position = 'relative';
    renderer.domElement.style.zIndex = 100;
    document.body.appendChild(renderer.domElement);

    ani()
    function ani(){
        renderer.render(scene,camera);
        requestAnimationFrame(ani);

        models.forEach(item => {
            // item.position.y += 0.01;
            item.position.y += 1;
            item.rotation.y += 0.01;
            if (item.position.y > 1000) {
                item.position.y = -1000;
            }
        });
        moneys.forEach(item => {
            item.position.y -= 1;
            if (item.position.y < -1000) {
                item.position.y = 1000;
            }
        })
    }
</script>
</html>
### 使用 Three.js 实现网页背景图动画效果 为了使用 Three.js 创建具有动态背景图像效果的网页,可以按照以下方法构建场景并应用纹理映射到几何体上。Three.js 提供了一种简单的方法来加载图片作为材质贴图,并将其应用于各种形状的对象。 首先,在 HTML 文件中引入 Three.js 库: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> ``` 接着初始化渲染器、相机和场景对象,并设置舞台尺寸以适应整个浏览器窗口大小[^1]: ```javascript // 初始化 renderer, camera 和 scene const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); camera.position.z = 5; ``` 创建一个平面网格用于展示背景图像,并为该网格指定带有所需图片路径的 `THREE.TextureLoader` 来加载纹理资源。之后将此纹理分配给材料属性中的 map 字段: ```javascript // 加载纹理并创建带纹理的材质 const textureLoader = new THREE.TextureLoader(); const texture = textureLoader.load('path/to/your/image.jpg'); const material = new THREE.MeshBasicMaterial({ map: texture }); // 定义一个大而平坦的表面作为背景墙 const geometry = new THREE.PlaneGeometry(10, 10); const mesh = new THREE.Mesh(geometry, material); scene.add(mesh); ``` 为了让背景看起来更生动有趣,可以通过改变时间参数 t 或者其他方式使背景元素移动或变形形成动画效果。这里给出一个简单的例子——让背景缓慢自转: ```javascript function animate() { requestAnimationFrame(animate); // 让背景慢慢旋转 mesh.rotation.x += 0.01; mesh.rotation.y += 0.01; renderer.render(scene, camera); } animate(); ``` 最后不要忘记监听窗口调整事件以便及时更新画布大小以及摄像机宽高比,从而保持良好的视觉体验: ```javascript window.addEventListener('resize', () => { const width = window.innerWidth; const height = window.innerHeight; renderer.setSize(width, height); camera.aspect = width / height; camera.updateProjectionMatrix(); }); ``` 上述代码片段展示了如何利用 Three.js 将静态图片转换成动态变化的全屏背景。当然还可以进一步探索更多可能性比如添加交互功能或是组合多个不同类型的图形创造更加丰富的视觉呈现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值