import * as THREE from "three";
let camera, scene, renderer;
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
2000
);
camera.position.set(0, 6, 5);
camera.lookAt(0, 0, 0);
renderer = new THREE.WebGLRenderer({
antialias: true,
logarithmicDepthBuffer: true,
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(new THREE.Color(0xeeeeee));
document.body.appendChild(renderer.domElement);
var spotLight = new THREE.SpotLight();
spotLight.position.set(30, 30, 30);
spotLight.castShadow = true;
scene.add(spotLight);
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshPhongMaterial({
color: 0x6688aa,
})
const cube = new THREE.Mesh(geometry, material);
cube.position.x = -1;
scene.add(cube);
const material2 = new THREE.MeshPhongMaterial({
color: 0x6688aa,
})
const cube2 = new THREE.Mesh(geometry, material2);
cube2.position.x = 1;
scene.add(cube2);
document.addEventListener(
'keydown',
(e) => {
var ev = e || window.event;
switch (ev.code) {
case 'ArrowLeft':
case 'KeyA':
cube.position.x -= 0.05;
break;
case 'ArrowRight':
case 'KeyD':
cube.position.x += 0.05;
break;
default:
break;
}
},
false
)
function onIntersect() {
let isCollide = false;
const centerCoord = cube.position.clone();
const position = cube.geometry.attributes.position;
const vertices = [];
for (let i = 0; i < position.count; i++) {
vertices.push(new THREE.Vector3(position.getX(i), position.getY(i), position.getZ(i)));
}
for (let i = 0; i < vertices.length; i++) {
let vertexWorldCoord = vertices[i].clone().applyMatrix4(cube.matrixWorld);
var dir = vertexWorldCoord.clone().sub(centerCoord);
let raycaster = new THREE.Raycaster(centerCoord, dir.clone().normalize());
let intersects = raycaster.intersectObjects([cube2], true);
if (intersects.length > 0) {
if (intersects[0].distance < dir.length()) {
isCollide = true;
}
}
}
return isCollide;
}
function render() {
requestAnimationFrame(render);
if (onIntersect()) {
cube.material.color.set('yellow')
} else {
cube.material.color.set(0x6688aa)
}
renderer.render(scene, camera);
}
requestAnimationFrame(render);