3d gjk

by black strings

HTML

<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/examples/js/controls/OrbitControls.js"></script>

CSS

body {
  overflow: hidden;
  margin: 0;
}

JavaScript

var scene = new THREE.Scene();
var axesHelper = new THREE.AxesHelper(20);
var mesh3D = new THREE.Mesh();
mesh3D.rotation.x = Math.PI / - 2;
var windowAxesHelper = new THREE.AxesHelper(20);
scene.add(axesHelper);
var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(-5, 5, 5);
var renderer = new THREE.WebGLRenderer({
  antialias: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

var controls = new THREE.OrbitControls(camera, renderer.domElement);

var light = new THREE.DirectionalLight(0xffffff);
light.position.set(3, 0, 1);
var lightMesh = new THREE.BoxGeometry(1, 1, 1);
var lightBox = new THREE.Mesh(lightMesh);
light.add(lightBox);
scene.add(light);

scene.add(new THREE.AmbientLight(0x404040));

var _window = new THREE.Mesh(new THREE.BoxGeometry(1, 1.5, 0.25), new THREE.MeshLambertMaterial({
  color: "brown"
}));
_window.geometry.translate(0, 0, 0.125);
_window.position.set(0, 0, 0.5);
_window.geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0, .25, 0));
_window.add(windowAxesHelper);
_window.rotation.x = Math.PI / 2;
mesh3D.add(_window);
scene.add(mesh3D);

var MAX_ITERATIONS = 64;

var meshes

var raycaster = new THREE.Raycaster();
var mouse = new THREE.Vector2();
var intersects = new THREE.Vector3();
var windowIntersects;
var dragging = false;
var offset = new THREE.Vector3();

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

window.addEventListener("mousemove", onMouseMove, false);
window.addEventListener("mousedown", onMouseDown, false);
window.addEventListener("mouseup", onMouseUp, false);

function onMouseDown(event) {
  mouse.set((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1);
  
  raycaster.setFromCamera(mouse, camera);

  windowIntersects = raycaster.intersectObjects([_window]);
  
 ...