导读:本期聚焦于小伙伴创作的《JavaScript如何实现3D图形?Three.js怎样在网页中创建场景》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript如何实现3D图形?Three.js怎样在网页中创建场景》有用,将其分享出去将是对创作者最好的鼓励。

在网页中实现3D图形效果,Three.js是目前最主流的解决方案之一,它通过封装WebGL底层复杂逻辑,让开发者可以用简洁的JavaScript代码快速搭建3D交互场景。创建3D场景需要核心依赖三个基础组件,分别是场景、相机和渲染器,三者配合才能将3D内容最终呈现在网页上。

JavaScript如何实现3D图形?Three.js怎样在网页中创建场景

Three.js创建3D场景的核心概念

场景(Scene)

场景是所有3D对象的容器,你可以把它理解为一个虚拟的三维空间,所有的几何体、光源、相机都需要被添加到场景中,才能参与到最终的渲染流程里。场景本身没有大小限制,你可以自由往里面添加任意数量的3D元素。

相机(Camera)

相机的作用类似于人眼,它决定了场景中哪些区域会被渲染出来,以及渲染的视角和范围。Three.js提供了多种相机类型,其中透视相机<PerspectiveCamera>是最常用的,它能模拟人眼的视觉效果,近大远小的透视关系更符合真实世界的观察习惯。

渲染器(Renderer)

渲染器负责将场景和相机组合计算后的3D内容,输出为二维的像素图像,最终显示在网页的canvas元素上。WebGL渲染器<WebGLRenderer>是Three.js默认的高效渲染器,能利用GPU加速提升3D渲染性能。

完整创建3D场景的步骤

第一步:引入Three.js库

可以通过CDN的方式直接引入Three.js,也可以先通过npm安装到本地项目后再引入。这里采用CDN引入的方式,适合快速测试场景效果。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Three.js基础场景</title>
    <style>
        body { margin: 0; overflow: hidden; }
        canvas { display: block; }
    </style>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js"></script>
    <script>
        // 后续场景代码写在这里
    </script>
</body>
</html>

第二步:初始化场景、相机、渲染器

首先创建场景实例,然后配置透视相机的参数,包括视野角度、宽高比、近截面和远截面,最后初始化渲染器并设置输出尺寸,将渲染器的canvas元素添加到页面中。

// 创建场景
const scene = new THREE.Scene();
// 设置场景背景色为浅灰色
scene.background = new THREE.Color(0xf0f0f0);

// 创建透视相机
// 参数:视野角度,宽高比,近截面,远截面
const camera = new THREE.PerspectiveCamera(
    75,
    window.innerWidth / window.innerHeight,
    0.1,
    1000
);
// 设置相机位置,z轴方向往后移动5个单位
camera.position.z = 5;

// 创建WebGL渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染器输出尺寸为窗口大小
renderer.setSize(window.innerWidth, window.innerHeight);
// 将渲染器的canvas元素添加到页面body中
document.body.appendChild(renderer.domElement);

第三步:添加几何体和材质

要让场景中有可见内容,需要创建几何体并搭配材质,然后将两者组合成网格对象添加到场景中。这里添加一个红色的立方体作为示例。

// 创建立方体几何体,参数为长宽高
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 创建基础网格材质,设置颜色为红色
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
// 组合几何体和材质生成网格对象
const cube = new THREE.Mesh(geometry, material);
// 将立方体添加到场景中
scene.add(cube);

第四步:添加光源

如果使用<MeshBasicMaterial>基础材质,不需要光源也能看到物体,但这种材质不会响应光照。如果要实现更真实的光照效果,建议使用<MeshStandardMaterial>标准材质,同时添加环境光和方向光。

// 创建环境光,均匀照亮所有物体
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);

// 创建方向光,模拟平行光效果
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
// 设置方向光位置
directionalLight.position.set(5, 5, 5);
scene.add(directionalLight);

// 替换之前的材质为标准材质
const standardMaterial = new THREE.MeshStandardMaterial({ color: 0xff0000 });
cube.material = standardMaterial;

第五步:实现动画循环

要让3D场景动起来,需要使用<requestAnimationFrame>实现动画循环,每一帧都更新物体的状态并重新渲染场景。

// 定义动画循环函数
function animate() {
    // 请求下一帧动画
    requestAnimationFrame(animate);
    
    // 让立方体绕y轴和x轴旋转
    cube.rotation.x += 0.01;
    cube.rotation.y += 0.01;
    
    // 渲染场景,传入场景和相机
    renderer.render(scene, camera);
}
// 启动动画循环
animate();

第六步:处理窗口 resize 事件

当浏览器窗口大小发生变化时,需要同步更新相机的宽高比和渲染器的输出尺寸,避免场景拉伸变形。

// 监听窗口大小变化事件
window.addEventListener('resize', () => {
    // 更新相机的宽高比
    camera.aspect = window.innerWidth / window.innerHeight;
    // 更新相机的投影矩阵
    camera.updateProjectionMatrix();
    // 更新渲染器的输出尺寸
    renderer.setSize(window.innerWidth, window.innerHeight);
});

完整可运行代码

将以下代码保存为HTML文件,直接在浏览器中打开就能看到旋转的红色立方体3D场景。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Three.js基础3D场景</title>
    <style>
        body { margin: 0; overflow: hidden; }
        canvas { display: block; }
    </style>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js"></script>
    <script>
        // 1. 初始化场景
        const scene = new THREE.Scene();
        scene.background = new THREE.Color(0xf0f0f0);

        // 2. 初始化相机
        const camera = new THREE.PerspectiveCamera(
            75,
            window.innerWidth / window.innerHeight,
            0.1,
            1000
        );
        camera.position.z = 5;

        // 3. 初始化渲染器
        const renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);

        // 4. 添加几何体和材质
        const geometry = new THREE.BoxGeometry(1, 1, 1);
        const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
        const cube = new THREE.Mesh(geometry, material);
        scene.add(cube);

        // 5. 添加光源
        const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
        scene.add(ambientLight);
        const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
        directionalLight.position.set(5, 5, 5);
        scene.add(directionalLight);

        // 6. 动画循环
        function animate() {
            requestAnimationFrame(animate);
            cube.rotation.x += 0.01;
            cube.rotation.y += 0.01;
            renderer.render(scene, camera);
        }
        animate();

        // 7. 处理窗口resize
        window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        });
    </script>
</body>
</html>

常见问题说明

  • 如果页面只显示空白,首先检查Three.js库是否成功引入,然后确认相机位置是否设置合理,避免相机在几何体内部导致看不到物体。
  • 使用标准材质时如果没有添加光源,物体会显示为全黑,这是正常的光照计算逻辑。
  • 如果场景出现性能问题,可以适当降低渲染器的像素比,或者减少场景中复杂几何体的数量。

Three.jsJavaScript3D图形场景创建修改时间:2026-06-14 06:12:55

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。