JSFiddle - React, Tailwind, and code Playground

by MichaelJendryke

CSS

body {
  overflow: hidden;
  margin: 0;
}

JavaScript

import * as _ from "https://threejs.org/build/three.module.js";
import {BufferGeometryUtils} from "https://threejs.org/examples/jsm/utils/BufferGeometryUtils.js";

let scene = new _.Scene();
let camera = new _.PerspectiveCamera(60, innerWidth / innerHeight, 1, 100);
camera.position.set(0, 0, 10);
let renderer = new _.WebGLRenderer();
renderer.setClearColor(0x202020);
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);

let geoms = [];
let c = new _.Color();

for (let i = 0; i < 3; i++){
	let g = createHex(i+666);  // just to have an ID
  g.translate(-3 + i*3, 0, 0);
  geoms.push(g);
}

let geom = BufferGeometryUtils.mergeBufferGeometries(geoms);

let mat = new _.MeshBasicMaterial({vertexColors: true, wireframe: true});

let mesh = new _.Mesh(geom, mat);
scene.add(mesh);

window.addEventListener( 'mousedown', getInstanceId, false );

let raycaster = new _.Raycaster();
let mouse = new _.Vector2();
let intersects;

function getInstanceId(event){
	mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
	mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
	raycaster.setFromCamera(mouse, camera);
  intersects = raycaster.intersectObject(mesh);
  if (intersects.length > 0){
  	let o = intersects[0];
    let instIdx = Math.floor(o.faceIndex / 4);
    console.log("instanceId is " + instIdx);
  }
}

renderer.setAnimationLoop(() => {
  renderer.render(scene, camera)
});


function createHex(theID){
	let pts = [];
  let baseVec = new _.Vector3(1, 0, 0);
  let axis = new _.Vector3(0, 0, 1);
  let angleStep = Math.PI / 3;
  c.set(Math.random() * 0x888888 + 0x888888);
  let col = [];
  
  for(let i = 0; i < 6; i++){
  	pts.push(new _.Vector3().copy(baseVec).applyAxisAngle(axis, angleStep * i));
    col.push(c.r, c.g, c.b);
  }
  
  let geomHex = new _.BufferGeometry().setFromPoints(pts);
  geomHex.setIndex([0, 2, 4, 0, 1, 2, 2, 3, 4, 4, 5, 0]);
  geomHex.setAttribute("color", new _.BufferAttribute(new Float32Array(col), 3));
  
 ...