threejs - 3D场景

124 阅读5分钟

前言

three.js场景 (Scene) 是一个用于渲染和展示3D图形的容器。它包含了所有的物体、光源和摄像机,并提供了一些方法和属性来控制场景的行为和外观。

Scene

你可以把三维场景Scene 对象理解为虚拟的3D场景,用来表示模拟生活中的真实三维场景,或者说三维世界。

// 创建3D场景对象Scene
const scene = new THREE.Scene();

Scene里可以放哪些东西

  1. Mesh(网格):网格是由几何体(Geometry)和材质(Material)组成的对象,用于表示3D物体的外观。
  2. Group(组):组是一种可以包含其他对象的容器,可以用来组织和管理多个物体。
  3. Light(光源):光源对象用于模拟场景中的光照效果,包括环境光、平行光、点光源等。
  4. Camera(摄像机):摄像机对象用于定义观察场景的视角和位置,可以是透视摄像机(PerspectiveCamera)或正交摄像机(OrthographicCamera)。
  5. Particle System(粒子系统):粒子系统用于创建和管理大量的粒子,如火花、烟雾、雨滴等效果。
  6. Line(线条):线条对象用于绘制3D空间中的线段。
  7. Points(点云):点云对象用于绘制大量的离散点,可以用于表示粒子效果或其他需要大量点的场景。
  8. Sprite(精灵):精灵是一个2D图像,可以根据摄像机的位置自动调整大小,用于创建2D效果。
  9. 其他自定义对象:你还可以根据自己的需求创建和添加其他类型的对象到场景中,以实现特定的效果或功能。 通过将这些对象添加到场景中,你可以创建出复杂的3D场景,并通过摄像机和渲染器将其呈现在屏幕上。

我们先介绍比较常见Mesh,group,其它的后面再介绍。

Mesh(网格)

Mesh(网格)是用于表示3D物体外观的对象。它由几何体(Geometry)和材质(Material)组成。

Geometry(几何体)

几何体(Geometry)用于定义物体的形状。它包含了一系列的顶点(Vertices)和面(Faces),以及其他相关的属性,如法线(Normals)、UV坐标(UV coordinates)等。 在threejs分装了一些常见的几何体类型,如下图所示。 image.png

// let geometry = new THREE.SphereGeometry(60, 40, 40); //创建一个球体几何对象 
let geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry

Material(材质)

在three.js中,材质(Material)用于定义物体的外观特性,如颜色、纹理、光照等。three.js提供了多种内置的材质类,可以根据需要选择合适的材质。

以下是一些常见的材质类:

  1. MeshBasicMaterial(基础网格材质):最简单的材质,只有颜色属性,不受光照影响。
  2. MeshLambertMaterial(兰伯特网格材质):具有漫反射光照效果的材质,可以接收光照并产生阴影。
  3. MeshPhongMaterial(冯氏网格材质):具有高光反射效果的材质,可以产生镜面反射和阴影。
  4. MeshStandardMaterial(标准网格材质):基于物理的材质,具有更真实的光照和阴影效果。
  5. MeshPhysicalMaterial(物理网格材质):更高级的基于物理的材质,可以模拟更多的光照和材质属性。
  6. 除了上述材质类,还有其他一些类似的材质,如MeshToonMaterial(卡通网格材质)、LineBasicMaterial(基础线材质)ShaderMaterial(着色器材质)等。

每种材质类都有不同的属性和参数,你可以根据需要进行调整和配置。 在创建材质后,你可以将其传递给Mesh对象的构造函数,以创建一个具有指定外观的网格对象。

image.png

let material = new THREE.MeshLambertMaterial({ color: 0x0000ff });

然后合并几何体和材质

let mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh 
scene.add(mesh); //网格模型添加到场景中

Group(组)

three.js中,Object3D(对象)是所有可见物体的基类。它充当了一个容器,可以包含其他的几何体、光源、相机等对象,并且可以对它们进行组合、变换和操作。Group的基类也是在Object3D。 Group用于将多个物体组合在一起,并对它们进行集体操作。Group类继承了Object3D的属性和方法,同时还提供了一些特定于组的功能。 使用Group可以方便地将多个物体组织在一起,形成一个逻辑上的整体。例如,你可以将多个网格对象添加到一个组中,然后对整个组进行平移、旋转或缩放操作,而不需要逐个操作每个网格对象。 Group类提供了以下常用方法和属性:

  • add(object):将一个对象添加到组中。
  • remove(object):从组中移除一个对象。
  • children:组中包含的子对象的数组。

通过使用Group,你可以更方便地管理场景中的多个物体,提高代码的可读性和可维护性。在需要对一组物体进行统一操作时,使用Group可以减少重复的代码,并使代码更加简洁和优雅。 通过使用group对物体进行分类管理,便于后期复杂场景下的业务逻辑维护(点击事件,图层控制等)

const group = new THREE.Group();
group.add(mesh1)  
group.add(mesh2)  
scene.add(group); //使用group就不需要scene.add(mesh1); 

总结

scene作为三维世界的容器,再往里放东西的时候根据业务需求通过group类将三维物体 以树形式add到scene,方便后期批量处理。

// 创建3D场景对象Scene 
const scene = new THREE.Scene();
let material = new THREE.MeshLambertMaterial({ color: 0x0000ff });
let mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh 
const group = new THREE.Group(); 
group.add(mesh) 
scene.add(group); //使用group就不需要scene.add(mesh1);