变换和坐标系
参考文章:https://discoverthreejs.com/zh/book/first-steps/transformations/
一、平移、旋转和缩放
每当我们在3D空间中移动对象时,我们都会使用称为转换的数学运算来进行。
- 平移translation:存储在对象的 .position属性中。
- 旋转rotation:存储在 .rotation属性中。
- 缩放scale:存储在.scale属性中。
这些构成了我们将用于在场景中移动对象的三个基本变换。
可以使用scene.add添加到场景中的每个对象都具有这些属性,包括网格、灯光和相机,而材质和几何图形则没有。我们之前使用.position用来 设置相机的位置:
// 我们之前使用.position用来 设置相机的位置 camera.position.set(0, 0, 10); // 设置定向光的位置 light.position.set(10, 10, 10); // 旋转我们的立方体: cube.rotation.set(-0.5, -0.1, 0.8); // 统一缩放 mesh.scale.set(1, 1, 1);
二、Object3D基类
所有可以添加到场景中的类都从Object3D基类派生,而Object3D基类定义了.position、.rotation和.scale属性。
网格、相机、灯光、点、线、助手,甚至场景本身这些类,我们将非正式地将派生自Object3D的类称为场景对象。
1、场景图
scene.add(mesh);
回想一下我们之前是这样将网格添加到场景中的,.add方法也是在Object3D中定义并在场景类上被继承,就像.position,.rotation和.scale。所有其他派生类也继承了这个方法,继承给了我们light.add、mesh.add、camera.add等等。这意味着我们可以将对象彼此互相添加,以创建一个顶部有场景的树结构。这种树状结构称为场景图。
parent.add(child)
场景是顶级父级。上图中的场景有三个孩子:一个灯光和两个网格。其中一个网格也有两个孩子。但是,每个对象(顶级场景除外)都只有一个父对象。
场景图中的每个对象(顶级场景除外)只有一个父对象,并且可以有任意数量的子对象。
当我们渲染场景时:renderer.render(scene, camera)
渲染器遍历场景图,从场景开始,并使用每个对象相对于其父对象的位置、旋转和缩放来确定在哪里绘制它。
可以使用 .children数组访问场景对象的所有子对象:
scene.add(mesh); // the children array contains the mesh we added scene.children; // -> [mesh] // now, add a light: scene.add(light); // the children array now contains both the mesh and the light scene.children; // -> [mesh, light]; // now you can access the mesh and light using array indices scene.children[0]; // -> mesh scene.children[1]; // -> light
有更复杂的方法可以访问特定的孩子,例如 Object3d.getObjectByName方法。但是,当你不知道对象的名称或它没有名称时,直接访问.children数组很有用。
三、坐标系
3D空间使用3D 笛卡尔坐标系来描述。3D笛卡尔坐标系由X,Y和Z轴组成,三轴交叉于点(0,0,0)(称为原点)。
1、世界空间
2、局部空间