var camera, scene, renderer, sphereGeometry, planeGeometry, sphereMaterial, planeMaterial, sphereMesh, planeMesh;
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
camera.position.z = 1000;
camera.lookAt(scene.position);
var pointLight = new THREE.DirectionalLight(0xbbbbbb);
pointLight.position.set(100, 100, 500);
var ambientLight = new THREE.AmbientLight(0xbbbbbb);
sphereGeometry = new THREE.SphereGeometry(200, 64, 64);
sphereMaterial = new THREE.MeshPhongMaterial({
sphereMesh = new THREE.Mesh(sphereGeometry, sphereMaterial);
planeGeometry = new THREE.PlaneGeometry(100, 100, 10, 10);
planeGeometry.dynamic = true;
planeMaterial = new THREE.MeshPhongMaterial({
planeMesh = new THREE.Mesh(planeGeometry, planeMaterial);
planeMesh.material.side = THREE.DoubleSide;
planeMesh.position.z = 201;
planeMesh.position.y = 50;
for (var vertexIndex = 0; vertexIndex < planeMesh.geometry.vertices.length; vertexIndex++) {
var localVertex = planeMesh.geometry.vertices[vertexIndex].clone();
var rayStart = new THREE.Vector3(0, 0, 500);
var ray = new THREE.Raycaster(rayStart, new THREE.Vector3(0, 0, -1));
var collisionResults = ray.intersectObject(sphereMesh);
numCollisions += collisionResults.length;
if (collisionResults.length > 0) {
planeMesh.geometry.vertices[vertexIndex].z = collisionResults[0].point.z - 1;
$('#Text').text('Number of collisions: ' + numCollisions);
planeMesh.geometry.verticesNeedUpdate = true;
planeMesh.geometry.normalsNeedUpdate = true;
var axes = new THREE.AxisHelper(500);
renderer = new THREE.WebGLRenderer({
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
renderer.render(scene, camera);
camera.position.x = 1000 * Math.cos(theta);
camera.position.z = 1000 * Math.sin(theta);
camera.lookAt(scene.position);
requestAnimationFrame(render);
document.addEventListener('keydown', function (e) {