57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景

实现效果

该案例实现了使用Three.js创建一个带有聚光灯和旋转立方体的3D场景。

知识点

WebGLRenderer(WebGL渲染器)

THREE.WebGLRenderer 是 Three.js 中用于将场景渲染为 WebGL 内容的核心类。它支持抗锯齿等高级特性。

构造器
javascript 复制代码
new THREE.WebGLRenderer(parameters)
参数 类型 描述
parameters Object 渲染器参数对象,包含 antialiasalpha 等属性
  • antialias: 布尔值,是否开启抗锯齿,默认为 false

Scene(场景)

THREE.Scene 代表一个3D场景,所有物体都必须添加到场景中才能被渲染。

方法
  • add(object): 将物体添加到场景中。
  • background: 设置场景的背景颜色或环境贴图。

PerspectiveCamera(透视相机)

THREE.PerspectiveCamera 定义了一个透视投影相机,用于模拟人眼观察世界的方式。

构造器
javascript 复制代码
new THREE.PerspectiveCamera(fov, aspect, near, far)
参数 类型 描述
fov Number 视野角度(Field of View),以度为单位
aspect Number 宽高比
near Number 近裁剪面距离
far Number 远裁剪面距离
方法
  • position.set(x, y, z): 设置相机位置。
  • lookAt(vector): 设置相机朝向目标点。
  • updateProjectionMatrix(): 更新相机的投影矩阵。

SpotLight(聚光灯)

THREE.SpotLight 表示一个聚光灯,可以模拟手电筒或舞台灯光的效果。

构造器
javascript 复制代码
new THREE.SpotLight(color, intensity, distance, angle, penumbra, decay)
参数 类型 描述
color Color 光源颜色
intensity Number 光照强度,默认为 1
distance Number 光源影响的最大距离,默认为无穷大
angle Number 聚光角度,默认为 Math.PI / 3
penumbra Number 半影区域大小,默认为 0
decay Number 光照衰减,默认为 1
方法
  • position.set(x, y, z): 设置光源位置。

SpotLightHelper(聚光灯辅助线)

THREE.SpotLightHelper 用于可视化聚光灯的光照范围。

构造器
javascript 复制代码
new THREE.SpotLightHelper(spotLight, size)
参数 类型 描述
spotLight SpotLight 要可视化的聚光灯
size Number 辅助线的尺寸,默认为 1

BoxGeometry(立方体几何体)

THREE.BoxGeometry 用于创建一个立方体几何体。

构造器
javascript 复制代码
new THREE.BoxGeometry(width, height, depth, widthSegments, heightSegments, depthSegments)
参数 类型 描述
width Number 立方体宽度
height Number 立方体高度
depth Number 立方体深度
widthSegments Number 宽度分段数,默认为 1
heightSegments Number 高度分段数,默认为 1
depthSegments Number 深度分段数,默认为 1

MeshPhongMaterial(网格材质)

THREE.MeshPhongMaterial 是一种基于 Phong 照明模型的材质,能够很好地表现光照效果。

构造器
javascript 复制代码
new THREE.MeshPhongMaterial(parameters)
参数 类型 描述
parameters Object 材质参数对象,包含 colormap 等属性
  • color: 材质颜色。
  • map: 纹理贴图。

Mesh(网格)

THREE.Mesh 是由几何体和材质组成的3D对象。

构造器
javascript 复制代码
new THREE.Mesh(geometry, material)
参数 类型 描述
geometry Geometry 几何体
material Material 材质
方法
  • translateX(amount): 沿X轴平移指定距离。

动画函数

requestAnimationFrame 是浏览器提供的用于执行动画的方法,确保动画帧率与显示器刷新率同步。

方法
javascript 复制代码
function animate() {
    requestAnimationFrame(animate);
    // 更新物体状态
    myMesh.rotation.x += 0.01;
    myMesh.rotation.y += 0.01;
    myMesh.rotation.z += 0.01;
    // 渲染场景
    myRenderer.render(myScene, myCamera);
}

代码

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="ThreeJS/three.js"></script>
    <script src="ThreeJS/jquery.js"></script>
</head>
<body>
<div id="myContainer"></div>
<script>
    var myRenderer = new THREE.WebGLRenderer({antialias: true});
    myRenderer.setSize(window.innerWidth, window.innerHeight);
    $("#myContainer").append(myRenderer.domElement);

    var myScene = new THREE.Scene();
    myScene.background = new THREE.Color('white');

    var myCamera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    myCamera.position.set(179.70, 84, 146);
    myCamera.lookAt(new THREE.Vector3(0, 0, 0));
    myCamera.updateProjectionMatrix();

    var mySpotLight = new THREE.SpotLight('lightgreen');
    mySpotLight.position.set(0, 100, 100);
    myScene.add(mySpotLight);

    var mySpotLightHelper = new THREE.SpotLightHelper(mySpotLight, 'green');
    myScene.add(mySpotLightHelper);

    var myBoxGeometry = new THREE.BoxGeometry(50, 50, 50);
    var myMap = THREE.ImageUtils.loadTexture("images/img002.jpg");
    var myMaterial = new THREE.MeshPhongMaterial({map: myMap});
    var myMesh = new THREE.Mesh(myBoxGeometry, myMaterial);
    myMesh.translateX(100);
    myScene.add(myMesh);

    function animate() {
        requestAnimationFrame(animate);
        myMesh.rotation.x += 0.01;
        myMesh.rotation.y += 0.01;
        myMesh.rotation.z += 0.01;
        myRenderer.render(myScene, myCamera);
    }

    animate();
</script>
</body>
</html>

演示链接

示例链接

相关推荐
lerhxx17 小时前
我用 R3F 手搓了一个能走进去的 3D 迷宫简历(上):从选型架构到迷宫生成算法
前端·javascript·three.js
张人玉2 天前
基于 Python 机器学习 与 PyQt5 桌面框架开发的可视化分析系统——基于大数据的网上购物消费行为分析可视化大屏
python·qt·机器学习·echarts·three.js
xiaominlaopodaren2 天前
three.js地图视口瓦片(一):屏幕角点射线
javascript·gis·three.js
xiaominlaopodaren4 天前
three.js最小地图运行时(十):接入离线逻辑瓦片剖面
javascript·gis·three.js
xiaominlaopodaren5 天前
three.js最小地图运行时(九):TileKey 线框与 cursor 坐标探针
javascript·gis·three.js
像我这样帅的人丶你还5 天前
🚀苹果的液态玻璃咋做?🚀
前端·webgl·three.js
张人玉6 天前
茶树 NeRF(Neural Radiance Fields,神经辐射场)三维重建与数据分析可视化系统——基于神经辐射场的茶树三维重建方法实现可视化大屏
python·数据挖掘·数据分析·echarts·three.js
xiaominlaopodaren6 天前
three.js最小地图运行时(八): 瓦片调试网格
javascript·gis·three.js
用户594404103567 天前
Three.js 实战:从零构建智慧城市 3D 可视化大屏,附完整交互式代码
three.js
爱喝麻油的小哆7 天前
🐾 Day 5|桌面数字人-接入llm可以对话啦
前端·three.js