变换和坐标系

参考文章: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、局部空间

 

posted @ 2025-04-04 21:54  我用python写Bug  阅读(16)  评论(0)    收藏  举报