Three.jsでWeb3D(WebGL) ~様々なジオメトリ(形状)を作る

Three.jsで様々なジオメトリ(形状)を作る(Three.js[r145]を使用)

マウス左ドラッグで回転、右ドラッグで移動、ホイールで拡大縮小できます。

ソースコード(左から順番に)

平面 ジオメトリ(THREE.PlaneGeometry)

//■平面ジオメトリの作成(幅、高さ、幅方向分割数、高さ方向分割数)
//平面ジオメトリは厚みが無く片面(表面)のみで、影は裏面のみ落とすので注意。
let planeGeometry=new THREE.PlaneGeometry(10,10,1,1);
//ジオメトリとマテリアルからメッシュを作成
let planeMesh=new THREE.Mesh(planeGeometry,material);
//メッシュをx軸で-90度回転させて水平にする
planeMesh.rotation.x=-Math.PI/2;
//メッシュの位置を設定
planeMesh.position.set(-80,0,0);
planeMesh.receiveShadow=true;//落ちてきた影を表示する
planeMesh.castShadow=false;//影を落とさない(両面表示材質の場合はfalseにする必要がある)
//メッシュをシーンに追加する
scene.add(planeMesh);

直方体 ジオメトリ(THREE.BoxGeometry)

//■直方体ジオメトリの作成(幅,高さ,奥行き)
let boxGeometry=new THREE.BoxGeometry(8,16,8);
//ジオメトリとマテリアルからメッシュを作成
let boxMesh=new THREE.Mesh(boxGeometry,material);
//メッシュの位置を設定
boxMesh.position.set(-70,0,0);
boxMesh.receiveShadow=true;//落ちてきた影を表示する
boxMesh.castShadow=true;//影を落とす
//メッシュをシーンに追加する
scene.add(boxMesh);

球体 ジオメトリ(THREE.SphereGeometry)

//■球体ジオメトリの作成(半径[1], 水平分割数幅[32], 垂直分割数[16], 水平方向開始角度[0], 垂直方向開始角度[Math.PI*2])
let sphereGeometry=new THREE.SphereGeometry(4,32,16,0,Math.PI*2);
//ジオメトリとマテリアルからメッシュを作成
let sphereMesh=new THREE.Mesh(sphereGeometry,material);
//メッシュの位置を設定
sphereMesh.position.set(-60,0,0);
sphereMesh.receiveShadow=true;//落ちてきた影を表示する
sphereMesh.castShadow=true;//影を落とす
//メッシュをシーンに追加する
scene.add(sphereMesh);

カプセル ジオメトリ(THREE.CapsuleGeometry)

//■カプセルジオメトリの作成(上下のカプセルの半径,中央セクションの長さ,キャップの曲線セグメント数[4],カプセル周囲の面の数[8])
let capsuleGeometry = new THREE.CapsuleGeometry( 4, 4, 4, 8 );
//ジオメトリとマテリアルからメッシュを作成
let capsuleMesh=new THREE.Mesh(capsuleGeometry,material);
//メッシュの位置を設定
capsuleMesh.position.set(-50,0,0);
capsuleMesh.receiveShadow=true;//落ちてきた影を表示する
capsuleMesh.castShadow=true;//影を落とす
//メッシュをシーンに追加する
scene.add(capsuleMesh);

円 ジオメトリ(THREE.CircleGeometry)

//■円ジオメトリの作成(半径,分割数(三角形の数)[8],開始角度[0],角度[Math.PI*2])
let circleGeometry = new THREE.CircleGeometry( 4, 8, 0, Math.PI*2 );
//ジオメトリとマテリアルからメッシュを作成
let circleMesh=new THREE.Mesh(circleGeometry,material);
//メッシュの位置を設定
circleMesh.position.set(-35,0,0);
circleMesh.receiveShadow=true;//落ちてきた影を表示する
circleMesh.castShadow=true;//影を落とす(裏面が影を落とすので影が表示されない)
//メッシュをシーンに追加する
scene.add(circleMesh);

リング(輪) ジオメトリ(THREE.RingGeometry)

//リング(輪)ジオメトリの作成(内側半径(0.5),外側半径(1),分割数(8),分割数(1),開始角度[0],角度[Math.PI*2])
let ringGeometry = new THREE.RingGeometry(3, 5, 32, 1, 0, Math.PI*2);
//ジオメトリとマテリアルからメッシュを作成
let ringMesh=new THREE.Mesh(ringGeometry,material);
//メッシュの位置を設定
ringMesh.position.set(-20,0,0);
ringMesh.receiveShadow=true;//落ちてきた影を表示する
ringMesh.castShadow=true;//影を落とす(裏面が影を落とすので影が表示されない)
//メッシュをシーンに追加する
scene.add(ringMesh);

円錐(コーン) ジオメトリ(THREE.ConeGeometry)

//■円錐(コーン)ジオメトリの作成(半径,高さ,分割数(三角形の数)[8],高さ面の分割数[1],底が空いてるか[false],始角度[0],角度[Math.PI*2])
let coneGeometry = new THREE.ConeGeometry( 4, 10, 8, 1, false, 0, Math.PI*2 );
//ジオメトリとマテリアルからメッシュを作成
let coneMesh=new THREE.Mesh(coneGeometry,material);
//メッシュの位置を設定
coneMesh.position.set(-5,0,0);
coneMesh.receiveShadow=true;//落ちてきた影を表示する
coneMesh.castShadow=true;//影を落とす(裏面が影を落とすので影が表示されない)
//メッシュをシーンに追加する
scene.add(coneMesh);

円柱 ジオメトリ(THREE.CylinderGeometry)

//■円柱ジオメトリの作成(上部半径,底半径,高さ,分割数(三角形の数)[8],高さ面の分割数[1],上下が空いてるか[false],始角度[0],角度[Math.PI*2])
let cylinderGeometry = new THREE.CylinderGeometry( 4, 6, 10, 8, 1, false, 0, Math.PI*2 );
//ジオメトリとマテリアルからメッシュを作成
let cylinderMesh=new THREE.Mesh(cylinderGeometry,material);
//メッシュの位置を設定
cylinderMesh.position.set(10,0,0);
cylinderMesh.receiveShadow=true;//落ちてきた影を表示する
cylinderMesh.castShadow=true;//影を落とす(裏面が影を落とすので影が表示されない)
//メッシュをシーンに追加する
scene.add(cylinderMesh);

トーラス(ドーナツ型) ジオメトリ(THREE.TorusGeometry)

//■トーラス(ドーナツ型)ジオメトリの作成(中心からチューブ中心迄の半径,チューブの半径,分割数[8],分割数[6],中心角[Math.PI*2])
let torusGeometry = new THREE.TorusGeometry(5, 2, 32, 32, Math.PI*2 );
//ジオメトリとマテリアルからメッシュを作成
let torusMesh=new THREE.Mesh(torusGeometry,material);
//メッシュの位置を設定
torusMesh.position.set(25,0,0);
torusMesh.receiveShadow=true;//落ちてきた影を表示する
torusMesh.castShadow=true;//影を落とす(裏面が影を落とすので影が表示されない)
//メッシュをシーンに追加する
scene.add(torusMesh);

チューブ(3Dカーブに沿って押し出し) ジオメトリ(THREE.TubeGeometry)

//■チューブ(3Dカーブに沿って押し出し)ジオメトリ
//基底クラスTHREE.Curveから派生したクラスを定義する
class CustomSinCurve extends THREE.Curve {
  constructor( scale = 1 ) {
    super();
    this.scale=scale;
  }
  //tは0~1迄の値が届く
  getPoint(t, optionalTarget=new THREE.Vector3()) {
    const tx = t*2-1;//-1~1
    const ty = Math.sin(2*Math.PI * t);//-1~1
    const tz = Math.cos(2*Math.PI * t);//-1~1
    return optionalTarget.set(tx,ty,tz).multiplyScalar(this.scale);
  }
}
let path=new CustomSinCurve(5);
//チューブジオメトリの作成()
let tubeGeometry = new THREE.TubeGeometry(path, 64, 1, 8, false);
//ジオメトリとマテリアルからメッシュを作成
let tubeMesh=new THREE.Mesh(tubeGeometry,material);
//メッシュの位置を設定
tubeMesh.position.set(40,0,0);
tubeMesh.receiveShadow=true;//落ちてきた影を表示する
tubeMesh.castShadow=true;//影を落とす(裏面が影を落とすので影が表示されない)
//メッシュをシーンに追加する
scene.add(tubeMesh);

旋盤(回転体) ジオメトリ(THREE.LatheGeometry)

//■旋盤(回転体)ジオメトリ
//(X→,Y↑)平面座標での点配列を作る
let points=[
  new THREE.Vector2(0,0),new THREE.Vector2(4,0),new THREE.Vector2(4,8),
  new THREE.Vector2(3.9,8),new THREE.Vector2(3.9,0.1),new THREE.Vector2(0,0.1),
];
//Y↑軸で回転させて旋盤(回転体)ジオメトリ作成(点配列,分割数,開始角[0],角度[Math.PI*2])
let latheGeometry = new THREE.LatheGeometry(points, 12, 0, Math.PI*2);
//ジオメトリとマテリアルからメッシュを作成
let latheMesh=new THREE.Mesh(latheGeometry,material);
//メッシュの位置を設定
latheMesh.position.set(60,0,0);
latheMesh.receiveShadow=true;//落ちてきた影を表示する
latheMesh.castShadow=true;//影を落とす(裏面が影を落とすので影が表示されない)
//メッシュをシーンに追加する
scene.add(latheMesh);

押し出し(掃引体) ジオメトリ(THREE.ExtrudeGeometry)

//■押し出し(掃引体)ジオメトリ
//X→,Y↑平面でシェイプを作成
let shape=new THREE.Shape();
shape.moveTo(0,0);
shape.lineTo(6,6);
shape.lineTo(6,-6);
shape.lineTo(-6,-6);
shape.lineTo(-6,6);
shape.lineTo(0,0);
//Z(奥行)方向に押し出してジオメトリを作成する
let extrudeGeometry = new THREE.ExtrudeGeometry(
  shape, 
  {
    spteps:1,//押し出し分割数(12)
    depth:10,//押し出し距離(1)
    bevelEnabled:true,//面取りを行う
    bevelThickness: 2,//ベベルの深さ(0.2)
    bevelSize: 2,     //ベベルが伸びる形状の輪郭からの距離(bevelThickness-9.1)
    bevelOffset: 0,   //ベベルが始まる形状のアウトラインからの距離(0)
    bevelSegments: 12  //ベベルレイヤー[ベベルの分割]数(3)
  }
);
//ジオメトリとマテリアルからメッシュを作成
let extrudeMesh=new THREE.Mesh(extrudeGeometry,material);
//メッシュの位置を設定
extrudeMesh.position.set(80,0,0);
extrudeMesh.receiveShadow=true;//落ちてきた影を表示する
extrudeMesh.castShadow=true;//影を落とす(裏面が影を落とすので影が表示されない)
//メッシュをシーンに追加する
scene.add(extrudeMesh);