【three.js系列四】入门教程——光源组合

982 阅读3分钟

Three.js 光源介绍

光源是 Three.js 中用于照亮场景的重要元素。它可以模拟自然界中的光照,使场景更加逼真。

image.png

Three.js 中有多种类型的光源,每种类型都有其独特的光照效果。以下是一些常见的光源类型:

1. 环境光(AmbientLight)

环境光是一种均匀照亮整个场景的光源,没有特定的方向。它通常用于模拟环境光照,例如天空光或漫射光。

2. 点光源(PointLight)

点光源是一种从一个点向四面八方发射光线的点状光源。它通常用于模拟台灯、蜡烛等光源。

3. 平行光(DirectionalLight)

平行光是一种从无限远处射来的平行光线。它通常用于模拟太阳光等光源。

4. 聚光灯(SpotLight)

聚光灯是一种锥形光束光源。它通常用于模拟手电筒、舞台灯光等光源。

5. 半球光(HemisphereLight)

半球光是一种模拟天空光和地面反射光的光源。它通常用于室外场景。

光源属性

每个光源都具有一些属性,用于控制其光照效果。以下是一些常见的光源属性:

  • 颜色(color) :光源的颜色
  • 强度(intensity) :光源的强度
  • 距离(distance) :光源的有效距离
  • 衰减(attenuation) :光源的光照衰减
  • 位置(position) :光源的位置
  • 方向(direction) :光源的方向
  • 目标(target) :光源的目标点

代码

这里以环境光为点光源为例

import * as THREE from "three";
import { OrbitControls } from "three/addons/controls/OrbitControls.js";

// 创建场景

// 场景能够让你在什么地方、摆放什么东西来交给three.js来渲染,这是你放置物体、灯光和摄像机的地方。
const scene = new THREE.Scene();
// 添加背景颜色
scene.background = new THREE.Color("#5c92ff");

// 创建相机
const camera = new THREE.PerspectiveCamera();
camera.position.y = 3;
camera.position.z = 10;

// 创建立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);

// 创建材质
const material = new THREE.MeshPhongMaterial({
  color: 0x0099ff,
  shininess: 150,
});

// 创建Mesh
const cube = new THREE.Mesh(geometry, material);
cube.position.set(0, 0.5, 0);

// 物体接受光源
cube.receiveShadow = true;
// 物体投射光源
cube.castShadow = true;
scene.add(cube);

// 添加灯光效果

// 添加环境光
const light = new THREE.AmbientLight(0xffffff, 1); // 柔和的白光
scene.add(light);

// 添加点光源
const pointlight = new THREE.PointLight(0xffffff, 100, 100);
pointlight.position.set(5, 3, 5);
pointlight.castShadow = true;
scene.add(pointlight);

// 创建地面
const meshfloor = new THREE.Mesh(
  new THREE.PlaneGeometry(10, 10),
  new THREE.MeshPhongMaterial({
    color: 0x1b5e20,
  })
);

meshfloor.rotation.x -= Math.PI / 2;

// 地面同样要设置接受光源
meshfloor.receiveShadow = true;
scene.add(meshfloor);

// 添加坐标辅助线
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;

// 将渲染器添加到页面
document.body.appendChild(renderer.domElement);

// 添加轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);

// 让立方体动起来
function animate() {
  // 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。
  requestAnimationFrame(animate);

  cube.rotation.y += 0.01;
  // 轨道控制器更新
  controls.update();
  renderer.render(scene, camera);
}
animate();

打开浏览器可见

image.png

参考网站:

Three.js中文网

b站