three.js - plane cut

by mmalex

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/91/three.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

CSS

body {
  overflow: hidden;
}

JavaScript

var renderer;
var camera;
var controls;

var scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(54, window.innerWidth / window.innerHeight, 0.1, 1000);

renderer = new THREE.WebGLRenderer({
  antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(new THREE.Color(0xfefefe));
document.body.appendChild(renderer.domElement);

camera.position.x = 5;
camera.position.y = 5;
camera.position.z = 5;
camera.lookAt(0, 0, 0);

controls = new THREE.OrbitControls(camera);

// white spotlight shining from the side, casting a shadow
var spotLight = new THREE.SpotLight(0xffffff, 2.5, 25, Math.PI / 6);
spotLight.position.set(9, 10, 1);
scene.add(spotLight);

var gridHelper = new THREE.GridHelper(4, 4);
scene.add(gridHelper);

//var geometry = new THREE.DodecahedronGeometry(1, 0);
var geometry = new THREE.SphereGeometry( 1, 16, 16 );
var material = new THREE.MeshPhongMaterial({
  color: 0xf0f0f0,
  transparent: true,
  opacity: 0.95
});
var cube = new THREE.Mesh(geometry, material);
scene.add(cube);

var plane = new THREE.Plane(new THREE.Vector3(-1, -1, 1), 0);
var helper = new THREE.PlaneHelper(plane, 3, 0xff00ff);
scene.add(helper);

var edgePlaneCut = function(edge, plane) {
	let line = new THREE.Line3(edge.start, edge.end);
  let target = new THREE.Vector3();
  plane.intersectLine ( line, target );
  return target;
};

// generate intersection points
{
  var cut = new THREE.Geometry();
  var part1 = new THREE.Geometry();
  var part2 = new THREE.Geometry();

  for (let faceIdx in geometry.faces) {
  
  	let face = geometry.faces[faceIdx];
    let v0 = geometry.vertices[face.a];
    let v1 = geometry.vertices[face.b];
    let v2 = geometry.vertices[face.c];
    let edge0 = {start: v0, end: v1};
    let edge1 = {start: v1, end: v2};
    let edge2 = {start: v2, end: v0};
    let c0 = edgePlaneCut(edge0, plane);
    let c1 = edgePlaneCut(edge1, plane);
    let c2 = edgePlaneCut(edge2, plane);
    
	  cut.vertices.push( c0, c1,...