教育機関向け活用例

7. 3Dオブジェクトのグループ化

このセクションでは、3Dオブジェクトをグループ化する方法を学びます。

グループ化する

3Dオブジェクトをグループ化するには、create.group() を使います。

const group = create.group()

このようにして作成したグループに、3Dオブジェクトを追加することで、グループ化することができます。

const group = create.group()
group.add(3Dオブジェクト1)
group.add(3Dオブジェクト2)
group.add(3Dオブジェクト3)

例えば、4つの立方体をグループ化して、グループ全体を回転させるコードは次のようになります。

index.html
const { camera, create, animate, controls, helper } = init();

controls.connect()
helper.grid()
helper.axes()
create.ambientLight()
create.directionalLight()
camera.position.set(0, 3, 3)

const group = create.group()
const cube1 = create.cube({ position: [-2, 0, 0], autoAdd: false });
const cube2 = create.cube({ position: [2, 0, 0], autoAdd: false });
const cube3 = create.cube({ position: [0, 0, -2], autoAdd: false });
const cube4 = create.cube({ position: [0, 0, 2], autoAdd: false });
group.add(cube1);
group.add(cube2);
group.add(cube3);
group.add(cube4);
animate(({ delta }) => {
  group.rotation.x += delta;
  group.rotation.y += delta;
  cube1.rotation.x += delta * 3;
  cube1.rotation.y += delta * 4;
});

グループ自体を回転させることで、グループ内のオブジェクトの位置関係を保ちつつ回転させることができます。
また、グループ内のオブジェクトにも個別に回転を加えることができます。

ここで重要なことは、グループに追加するオブジェクトを作る際に autoAdd: false を指定することです。
通常 create でオブジェクトを作った場合、自動的にシーン(3D空間)に追加されます。
グループを利用する場合は、オブジェクトはグループに追加し、そのグループをシーンに追加するため、 オブジェクトが2重にシーン追加されることを防ぐために autoAdd: false を指定します。

また、グループ作成時に直接オブジェクトを追加することもできます。
この場合、

group.children[番号]

で、追加したオブジェクトにアクセスすることができます。
番号は追加した順番に0から始まります。

index.html
const { camera, create, animate, controls, helper } = init();

controls.connect()
helper.grid()
helper.axes()
create.ambientLight()
create.directionalLight()
camera.position.set(0, 3, 3)

const group = create.group({
  children: [
    create.cube({ position: [-2, 0, 0], autoAdd: false }),
    create.cube({ position: [2, 0, 0], autoAdd: false }),
    create.cube({ position: [0, 0, -2], autoAdd: false }),
    create.cube({ position: [0, 0, 2], autoAdd: false }),
  ],
});
animate(({ delta }) => {
  group.rotation.x += delta;
  group.rotation.y += delta;
  group.children[0].rotation.x += delta * 3;
  group.children[0].rotation.y += delta * 4;
});