Three.js场景
创作时间:
作者:
@小白创作中心
Three.js场景
引用
CSDN
1.
https://m.blog.csdn.net/mmc123125/article/details/145131723
Three.js是一个基于WebGL的JavaScript库,专注于在网页中创建交互式的3D图形。虽然听起来很酷,但其实入门比你想象中容易得多!今天,我们通过三步带你创建一个简单的Three.js场景,让你零基础也能绘制一个炫酷的3D世界。
一、准备工作
在开始之前,请确保你具备以下条件:
- 基础的HTML和JavaScript知识。
- 一台能运行现代浏览器的电脑(推荐使用Chrome)。
- 一个代码编辑器(如VS Code)。
引入Three.js
有两种方法使用Three.js:
- 通过CDN引入:推荐给初学者。只需在HTML中添加以下
<script>
标签即可:
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
- 通过npm安装:如果你使用模块化开发或构建工具,可以通过以下命令安装:
npm install three
二、三步搭建你的第一个场景
第1步:创建基本场景
Three.js的基本场景需要以下三大核心组件:
- 场景(Scene):这是你放置物体的地方。
- 相机(Camera):就像观众的视角,用来观察场景。
- 渲染器(Renderer):将场景和相机渲染为可在网页中显示的图像。
代码实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Three.js场景</title>
<style>
body { margin: 0; }
canvas { display: block; }
</style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
<script>
// 创建场景
const scene = new THREE.Scene();
// 创建相机
const camera = new THREE.PerspectiveCamera(
75, // 视角
window.innerWidth / window.innerHeight, // 宽高比
0.1, // 近剪裁面
1000 // 远剪裁面
);
camera.position.z = 5; // 设置相机离场景的距离
// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染尺寸
document.body.appendChild(renderer.domElement); // 将渲染器的canvas添加到页面
</script>
</body>
</html>
到这里,你已经创建了一个空的3D场景,但目前什么都看不到。接下来,我们会添加物体和灯光。
第2步:添加3D物体
Three.js提供了多种内置的几何体供我们使用,比如立方体、球体、平面等。你可以通过组合几何体(Geometry)和材质(Material)创建一个可视化的3D物体。
添加一个旋转的立方体:
// 创建一个立方体
const geometry = new THREE.BoxGeometry(); // 几何体
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); // 材质
const cube = new THREE.Mesh(geometry, material); // 网格(几何体+材质)
scene.add(cube); // 将立方体添加到场景
实现旋转效果:
// 创建动画循环
function animate() {
requestAnimationFrame(animate); // 循环调用
cube.rotation.x += 0.01; // 绕x轴旋转
cube.rotation.y += 0.01; // 绕y轴旋转
renderer.render(scene, camera); // 渲染场景
}
animate(); // 启动动画
第3步:优化场景并添加交互
为了让场景更真实,我们需要添加灯光并支持用户交互。
添加灯光
// 添加点光源
const light = new THREE.PointLight(0xffffff, 1, 100); // 点光源,白光
light.position.set(10, 10, 10); // 设置光源位置
scene.add(light); // 添加光源到场景
响应屏幕大小调整
当用户调整浏览器窗口大小时,场景也需要重新调整:
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight; // 更新相机宽高比
camera.updateProjectionMatrix(); // 更新投影矩阵
renderer.setSize(window.innerWidth, window.innerHeight); // 更新渲染器尺寸
});
三、完整代码示例
以下是完整的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Three.js场景</title>
<style>
body { margin: 0; }
canvas { display: block; }
</style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/110/three.min.js"></script>
<script>
// 创建场景
const scene = new THREE.Scene();
// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 添加立方体
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// 添加灯光
const light = new THREE.PointLight(0xffffff, 1, 100);
light.position.set(10, 10, 10);
scene.add(light);
// 动画循环
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
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>
四、运行效果
打开HTML文件,你会看到一个绿色的立方体在页面中旋转。如果调整窗口大小,场景也会自适应调整。
五、总结与下一步
通过以上三步,你已经学会了如何搭建一个简单的Three.js场景并实现基础动画。这只是个开始,Three.js还能帮助你实现复杂的3D模型加载、交互式动画以及更高级的特效。接下来,你可以尝试:
- 添加更多几何体(球体、平面等)。
- 加载外部3D模型(如GLTF、OBJ文件)。
- 使用鼠标或键盘与3D场景互动。
下一篇文章:Three.js光影魔术手:探索灯光与材质的魅力🚀
热门推荐
鸡蛋期货价格波动的原因是什么?这种波动会产生怎样的后果?
牙科医保能跨省报销吗?分享口腔门诊医保项目清单及异地报销政策!
数据港行业分析
阿胶珠怎么吃
撤职处分的解读与适用
如何体验独特的海洋主题公园?这类公园的吸引力在哪里?
刘邦:从小混混到泗水亭长的蜕变之路
四月初八浴佛节:由来与民俗
如何管理GLP试验项目
胎生动物的主要特点及狐狸的繁殖方式
日本动画电影全球票房top10
地图比例尺:尺寸大小如何影响你的阅读体验?
企业门户网站的重要性、规划与设计、内容构建、技术实现、用户体验
八字五行旺衰详解
注安技术知识点:火灾基本概念及参数(引燃能、闪点、燃点、自燃点)
酱肉包子馅的详细制作方法
又到候鸟迁徙季 不干扰是最好的保护
2025年3-5月适合短途出行的五个城市
职工社会养老保险视同缴费年限如何算
AI搜索,战火重燃
改变蒙古征服进程的守城战:钓鱼城之战
乌兰察布旅行攻略:全面路线与自由行游玩指南
市政债券市场:探究其资本市场的特性与功能
电解质水的作用与功效
信用卡债务不还会有哪些后果
手冲咖啡必备的器具有哪些?手冲工具全套怎么买?不同价位的咖啡手摇磨豆机区别!
莼菜汤的家常做法几分钟
完不成“八十一难”会怎样 “西游新说”让人笑中带泪
多方合作资源共享 湖南汉寿大力发展低空经济
党支部制度建设怎么提升组织凝聚力?