返回

three.js@0.134.0源码解读之重读Object3D

前端

当然,对Object3D的解读,笔者更倾向于从其文档开始,这里提炼出一些Object3D比较重要的特性和方法。

  • Object3D是一个可被添加到场景的3D对象。
  • Object3D具有位置、旋转和缩放变换,可通过其position、rotation和scale属性进行控制。
  • Object3D可以拥有子对象,可通过其children属性进行管理。
  • Object3D可以通过add()和remove()方法来添加和删除子对象。
  • Object3D可以通过attach()和detach()方法来附加和分离对象。
  • Object3D可以通过dispatchEvent()和addEventListener()方法来触发和监听事件。

上面的简介基本上涵盖了Object3D的大部分特点。Object3D可以说是three.js中最重要的基础类之一,通过它我们可以轻松创建和管理3D场景中的各种对象。

我们来看看Object3D的源代码,首先是其构造函数,如下所示:

function Object3D() {
	this.uuid = THREE.Math.generateUUID();
	this.name = '';
	this.type = 'Object3D';
	this.parent = null;
	this.children = [];
	this.up = new THREE.Vector3(0, 1, 0);
	this.position = new THREE.Vector3();
	this.rotation = new THREE.Euler();
	this.scale = new THREE.Vector3(1, 1, 1);
	this.rotationAutoUpdate = true;
	this.matrix = new THREE.Matrix4();
	this.matrixWorld = new THREE.Matrix4();
	this.matrixAutoUpdate = true;
	this.matrixWorldNeedsUpdate = false;
	this.layers = new THREE.Layers();
	this.visible = true;
	this.castShadow = false;
	this.receiveShadow = false;
	this.frustumCulled = true;
	this.renderOrder = 0;
	this.userData = {};
	this.onBeforeRender = null;
	this.onAfterRender = null;
}

从构造函数中我们可以看到,Object3D主要包含以下属性:

  • uuid:一个唯一的标识符。
  • name:名称。
  • type:类型,通常为“Object3D”。
  • parent:父对象。
  • children:子对象数组。
  • up:向上向量,用于确定对象的顶部。
  • position:位置向量。
  • rotation:旋转欧拉角。
  • scale:缩放向量。
  • rotationAutoUpdate:是否自动更新旋转欧拉角。
  • matrix:本地变换矩阵。
  • matrixWorld:世界变换矩阵。
  • matrixAutoUpdate:是否自动更新世界变换矩阵。
  • matrixWorldNeedsUpdate:是否需要更新世界变换矩阵。
  • layers:层级。
  • visible:是否可见。
  • castShadow:是否投射阴影。
  • receiveShadow:是否接收阴影。
  • frustumCulled:是否进行视锥体裁剪。
  • renderOrder:渲染顺序。
  • userData:用户数据。
  • onBeforeRender:在渲染前触发的事件。
  • onAfterRender:在渲染后触发的事件。

Object3D还包含了一些方法,其中比较重要的方法包括:

  • add():添加子对象。
  • remove():删除子对象。
  • attach():附加对象。
  • detach():分离对象。
  • updateMatrix():更新本地变换矩阵。
  • updateMatrixWorld():更新世界变换矩阵。
  • rotateX():绕X轴旋转。
  • rotateY():绕Y轴旋转。
  • rotateZ():绕Z轴旋转。
  • translateX():沿X轴平移。
  • translateY():沿Y轴平移。
  • translateZ():沿Z轴平移。
  • scaleX():沿X轴缩放。
  • scaleY():沿Y轴缩放。
  • scaleZ():沿Z轴缩放。
  • setRotationFromEuler():从欧拉角设置旋转。
  • setRotationFromQuaternion():从四元数设置旋转。
  • setRotationFromAxisAngle():从轴角设置旋转。
  • lookAt():看向指定位置。

这些方法基本涵盖了Object3D的大部分功能,通过这些方法我们可以轻松操纵3D对象。