var WIDTH = window.innerWidth,
HEIGHT = window.innerHeight;
var scene = new THREE.Scene();
var mouse = new THREE.Vector2();
var camera = new THREE.PerspectiveCamera(75, WIDTH / HEIGHT, 1, 10000);
var raycaster = new THREE.Raycaster();
var renderer = new THREE.WebGLRenderer({ antialias: true});
function newCircle(radius, color, pos) {
material = new THREE.LineBasicMaterial({color: color});
geometry = new THREE.CircleGeometry(radius, segments);
geometry.vertices.shift();
var circle = new THREE.Line(geometry, material);
circle.position.set(pos.x, pos.y, pos.z);
scene.background = new THREE.Color(0xff00ff);
camera.position.z = 1000;
renderer.setSize(WIDTH, HEIGHT);
document.body.appendChild(renderer.domElement);
var c1 = newCircle(20, 0x0000ff, new THREE.Vector3(-50, 0, 0));
scene.updateMatrixWorld(true);
var c1Pos = new THREE.Vector3();
c1Pos.setFromMatrixPosition(c1.matrixWorld);
var geometry = new THREE.Geometry();
geometry.vertices.push(c1Pos);
geometry.vertices.push(new THREE.Vector3(100, 50, 0));
var material = new THREE.LineBasicMaterial({
var line = new THREE.Line(geometry, material);
document.addEventListener('mousemove', onMouseMove, false);
window.addEventListener( 'resize', onWindowResize, false );
raycaster.setFromCamera(mouse.clone(), camera);
var intersects = raycaster.intersectObjects(scene.children);
if ( intersects.length > 0 )
if ( intersects[ 0 ].object != INTERSECTED )
INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
INTERSECTED = intersects[ 0 ].object;
INTERSECTED.currentHex = INTERSECTED.material.color.getHex();
INTERSECTED.material.color.setHex( 0xffffff );
INTERSECTED.material.color.setHex( INTERSECTED.currentHex );
renderer.render(scene, camera);
function onMouseMove(event) {
mouse.x = ( event.clientX / WIDTH ) * 2 - 1;
mouse.y = - ( event.clientY / HEIGHT ) * 2 + 1;
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );