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光影魔术手:探索灯光与材质的魅力🚀
热门推荐
IG战队:中国电竞的荣耀之师
面粉的魔法:解锁那些简单又美味的家常料理
洗澡不能先洗头?万万没想到这么多年的澡都洗错了
Win11如何设置家长控制?如何限制小孩使用电脑?
专票和普票的区别:全面解析与对比
猫呼噜声里的秘密:25-150Hz声波如何操控人类催产素分泌?
微信聊天记录的保密义务如何界定
三相无刷电机正弦波驱动,为何成为高端设备“宠儿”?
深度解析三相无刷直流电机控制算法:原理、特点与应用适配
导航为何能预知红绿灯变化?揭秘背后的城市智慧
Web实现车辆定位的技术详解
恒大集团财务风波再起:透视其背后的经营挑战
上升双子为啥很难找对象,上升双子座的女生婚姻
龙息:神寂如何吸引新玩家的秘密(探索卡牌RPG内容设计的深度)
睡眠呼吸暂停综合征的治疗方法及注意事项
如何学习骑马:从基础到精通的全方位指南
明日方舟阿斯卡纶强度测评:值得抽取的强力特种干员
胖人服饰搭配指南:六大要点助你展现自信魅力
含茶氨酸饮料不是“安眠神水”!
新增3座车站“三权”移交,地铁十二号线东西段过半车站进入运营调试
美联储(曾经)是如何购买国债的
1500元组装电脑攻略:从硬件选购到系统维护的全方位指南
科普 | 白发是由黑发慢慢变白的,还是直接从毛囊长出来的?
一篇文章告诉你,换手机卡到底要不要关机?
如何有效查询自己的共青团入团时间与相关信息指南
永远别轻易帮助一个落难的朋友!心理学:害人又不利己!
别大意!糖友每年务必要完成的4项检查,你都知道吗?
中国画中的鸡题材:吉祥、德行与艺术之美
低因咖啡豆怎么选?三大制作方法与风味特点全解析
私域增长时,“筛选流量”比“培育用户”更重要?