首页
/ Threestrap项目实战:在DOM元素中创建3D立方体场景

Threestrap项目实战:在DOM元素中创建3D立方体场景

2025-07-04 17:26:49作者:柏廷章Berta

概述

本文将深入解析如何使用Threestrap框架在HTML DOM元素中创建动态3D立方体场景。Threestrap是一个轻量级的Three.js封装库,它简化了Three.js的初始化过程,使开发者能够更快速地上手3D图形开发。

环境准备

首先需要引入必要的JavaScript库:

  1. Three.js - 流行的3D图形库
  2. Threestrap - Three.js的轻量级封装

在HTML文件中通过<script>标签引入这两个库即可开始3D开发。

基础设置

创建容器元素

在HTML中定义一个<div>元素作为3D场景的容器:

<div id="three"></div>

通过CSS设置其尺寸:

#three {
  width: 500px;
  height: 500px;
}

初始化Threestrap

使用Threestrap的Bootstrap类初始化3D场景:

var three = new Threestrap.Bootstrap({
  plugins: ["core", "stats"],
  element: "#three",
});

这里配置了两个核心插件:

  • core:提供基本功能
  • stats:显示性能统计信息

3D场景构建

随机数生成器

为了实现随机分布的立方体,定义了一个伪随机数生成器:

var sd = 12345;
function rnd() {
  sd = Math.abs(Math.sin(sd * 10000) * 1000) % 1;
  return sd * 2 - 1;
}

这个生成器基于正弦函数,可以产生-1到1之间的随机数。

创建彩色立方体

定义一组颜色并创建100个随机立方体:

var colors = [
  new THREE.Color(0x3090ff),
  new THREE.Color(0x10a0ff),
  new THREE.Color(0x60109f),
];

for (var i = 0; i < 100; ++i) {
  var sz = 1 + rnd() * 0.2; // 随机大小
  var mesh = new THREE.Mesh(
    new THREE.BoxGeometry(sz, sz, sz),
    new THREE.MeshPhongMaterial({ color: colors[i % colors.length] })
  );
  mesh.position.set(rnd() * 10, rnd() * 10, rnd() * 10);
  three.scene.add(mesh);
}

每个立方体具有:

  • 随机大小(0.8-1.2倍基础尺寸)
  • 循环使用预设颜色
  • 随机位置(-10到10范围内)

光照设置

3D场景需要适当的光照才能显示立体效果:

// 半球光 - 模拟环境光
var hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 0.6);
hemiLight.color.setHSL(0.6, 1, 0.6);
hemiLight.groundColor.setHSL(0.095, 1, 0.75);
hemiLight.position.set(0, 500, 0);
three.scene.add(hemiLight);

// 平行光 - 模拟太阳光
var dirLight = new THREE.DirectionalLight(0xffffff, 1);
dirLight.color.setHSL(0.1, 1, 0.95);
dirLight.position.set(-1, 1.75, 1);
dirLight.position.multiplyScalar(50);
three.scene.add(dirLight);

相机动画

让相机围绕场景旋转,提供更好的3D视角:

three.on("update", function () {
  var t = three.Time.now;
  three.camera.position.set(
    -Math.cos(t) * 5,
    Math.sin(t) * 5,
    Math.sin(t * 0.718) * 5
  );
  three.camera.lookAt(new THREE.Vector3());
});

这段代码实现了:

  • 相机在XZ平面做圆周运动
  • Y轴添加额外正弦运动,增加视觉变化
  • 相机始终看向场景中心

技术要点总结

  1. Threestrap简化了Three.js的初始化:通过Bootstrap类快速创建3D场景,无需手动设置渲染器、场景、相机等基础组件。

  2. DOM集成:可以直接将3D场景嵌入到现有HTML元素中,方便与传统网页内容结合。

  3. 事件驱动:利用update事件实现动画效果,比传统的requestAnimationFrame更简洁。

  4. 光照配置:合理设置环境光和定向光对3D场景的视觉效果至关重要。

  5. 随机分布算法:展示了如何创建视觉上自然分布的3D对象。

这个示例展示了Threestrap的核心优势 - 让开发者专注于3D内容的创作,而不是繁琐的初始化配置。通过这种方式,即使是3D开发新手也能快速创建出专业级的3D场景。

登录后查看全文
热门项目推荐

热门内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
858
511
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
258
298
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
kernelkernel
deepin linux kernel
C
22
5