每日见闻之Three.js 创建一个四边形 并双面贴图

js 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Three.js PlaneGeometry 示例</title>
    <style>
        body { margin: 0; }
        canvas { display: block; }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
</head>
<body>
    <script>
        // 创建场景
        const scene = new THREE.Scene();
        scene.background = new THREE.Color(0x87CEEB); // 天空蓝色背景
        
        // 创建相机
        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        camera.position.set(0, 2, 5); // 相机位置:x=0, y=2, z=5
        camera.lookAt(0, 0, 0); // 相机看向原点
        
        // 创建渲染器
        const renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);
        
        // 创建平面几何体(地面)
        const planeGeometry = new THREE.PlaneGeometry(
            5,  // 宽度
            5,  // 高度
            10,  // 宽度分段
            10   // 高度分段
        );
        
        // 加载地面纹理
        const textureLoader = new THREE.TextureLoader();
        const groundTexture = textureLoader.load('https://qcloud.dpfile.com/pc/_vzQAXVr13f_7iwVuYMN-KZdECsM6WjeAFvnO_6J6g0hOLcGgiPlxc9FC8mAyrgC.jpg');
        
        // 设置纹理重复 可以设置平铺的次数
        groundTexture.wrapS = THREE.RepeatWrapping;
        groundTexture.wrapT = THREE.RepeatWrapping;
        groundTexture.repeat.set(3, 5); // 重复5x5次
        
        // 创建材质
        const groundMaterial = new THREE.MeshStandardMaterial({
            map: groundTexture,
            side: THREE.DoubleSide
        });
        
        // 创建地面网格并旋转(默认平面沿XZ轴,这里旋转后沿XY轴作为地面)
        const ground = new THREE.Mesh(planeGeometry, groundMaterial);

        ground.position.y = 0; // 放置在y=0位置
        scene.add(ground);
        
        // 添加光源
        const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
        scene.add(ambientLight);
        
        const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
        directionalLight.position.set(5, 10, 7.5); // 光源位置
        scene.add(directionalLight);
        
        // 动画循环
        function animate() {
          ground.rotation.x += 0.001;
            requestAnimationFrame(animate);
            renderer.render(scene, camera);
        }
        animate();
        
        // 窗口大小适配
        window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        });
    </script>
</body>
</html>
    
相关推荐
IT_陈寒2 分钟前
JavaScript的异步地狱,我差点没爬出来
前端·人工智能·后端
光影少年3 分钟前
Webpack打包性能优化方面的经验
前端·webpack·性能优化
Das19 分钟前
通过命令行下载kaggle数据
前端·chrome
剑神一笑24 分钟前
CSS Animation Timeline 可视化动画编辑器:从关键帧到流畅动画
前端·css·编辑器
Dylan的码园27 分钟前
springBoot与Web后端基础
前端·spring boot·后端
广州华水科技27 分钟前
单北斗变形监测应用于水库的精准GNSS技术解析
前端
2401_878454531 小时前
HTML和CSS的复习2
前端·css·html
We་ct1 小时前
吃透现代CSS全技术体系
前端·css·css3·sass·postcss·预处理器
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_11:(语义化容器全站重构+独立CSS拆分+字体合规引入)
前端·css·ui·重构·html·edge浏览器
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_10:(超链接核心语法+路径规则)
前端·css·笔记·ui·html·edge浏览器