[Three.js] 정다면체의 표면에 각각 색칠하는 방법

17345 단어 JavaScript3dtech
찾아봤자 어디에도 기재가 없으니 적어야 한다.

전제 조건


장면, 조명, 카메라의 설정이 이미 완성되었다.

입방체의 상황


입방체의 각 면에 색을 칠할 때
6면의 색상을 정렬하여 준비하여 지정하면 됩니다.
const geometryCube = new THREE.BoxGeometry(200, 200, 200);
const materialColors = [
  new THREE.MeshBasicMaterial({color: 0xff0000}),
  new THREE.MeshBasicMaterial({color: 0x0000ff}),
  new THREE.MeshBasicMaterial({color: 0x00ff00}),
  new THREE.MeshBasicMaterial({color: 0xffff00}),
  new THREE.MeshBasicMaterial({color: 0x00ffff}),
  new THREE.MeshBasicMaterial({color: 0xff00ff}),
];
const cube = new THREE.Mesh(geometryCube, materialColors);
scene.add(cube);

정다면체의 상황


양의 다면체의 경우 위 지정만 표시되고 아무 것도 표시되지 않습니다.
다양한 조사 결과groups를 설정해 색상 구분이 가능하다.
이번에는 스무 면체로 만들어 보았다.
const geometryCube = new THREE.IcosahedronGeometry(200); // 正二十面体 Geometry の作成
// 色の設定
const materialColors = [
  new THREE.MeshBasicMaterial({color: 0xff0000}),
  new THREE.MeshBasicMaterial({color: 0x0000ff}),
  new THREE.MeshBasicMaterial({color: 0x00ff00}),
  new THREE.MeshBasicMaterial({color: 0xffff00}),
  new THREE.MeshBasicMaterial({color: 0x00ffff}),
  new THREE.MeshBasicMaterial({color: 0xff00ff}),
  new THREE.MeshBasicMaterial({color: 0xcccccc}),
  new THREE.MeshBasicMaterial({color: 0xffffff}),
  new THREE.MeshBasicMaterial({color: 0xff9100}),
  new THREE.MeshBasicMaterial({color: 0x87322f}),
  new THREE.MeshBasicMaterial({color: 0x87322f}),
  new THREE.MeshBasicMaterial({color: 0xff9100}),
  new THREE.MeshBasicMaterial({color: 0xffffff}),
  new THREE.MeshBasicMaterial({color: 0xcccccc}),
  new THREE.MeshBasicMaterial({color: 0xff00ff}),
  new THREE.MeshBasicMaterial({color: 0x00ffff}),
  new THREE.MeshBasicMaterial({color: 0xffff00}),
  new THREE.MeshBasicMaterial({color: 0x00ff00}),
  new THREE.MeshBasicMaterial({color: 0x0000ff}),
  new THREE.MeshBasicMaterial({color: 0xff0000}),
];

// addGroup 関数を使って、Geometry に groups を設定する
// addGroup 関数 → https://threejs.org/docs/#api/en/core/BufferGeometry.addGroup
// start は、index 値を3の倍数で増やしていく(他の倍数でも可)
// count は面の数を指定する (今回は20)
// materialIndex は materialColors の index 値を指定する(この値が色分けの指標になる。今回は長さが同じなので、このまま index 値を指定する)
for (let i = 0; i < 20; i++) {
  geometryCube.addGroup(i * 3, 20, i);
}
const cube = new THREE.Mesh(geometryCube, materialColors);
scene.add(cube);

완성


20면은 각각 색상으로 구분되어 표시됩니다.

좋은 웹페이지 즐겨찾기