Path drawing
by ikatyang
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r76/three.min.js"></script>
<script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/OrbitControls.js"></script>
CSS
body {
margin: 0;
overflow: hidden;
}
JavaScript
var camera, scene, renderer, controls;
var ball;
init();
animate();
function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 20000);
camera.position.set(0, 300, 500);
scene.add(camera);
ball = new THREE.Mesh(new THREE.SphereGeometry(5, 12, 12));
ball.position.set(-100, 0, 0);
ball.velocity = new THREE.Vector3(1, 2, 0).setLength(500);
scene.add(ball);
var gridXZ = new THREE.GridHelper(200, 20, 0xff0000, 0x88888888);
scene.add(gridXZ);
renderer = new THREE.WebGLRenderer();
renderer.setClearColor(0xffffff);
renderer.setSize(window.innerWidth, window.innerHeight);
controls = new THREE.OrbitControls(camera, renderer.domElement);
document.body.appendChild(renderer.domElement);
window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function updatePosition(delta) {
var force = new THREE.Vector3(0, -980, 0);
ball.velocity.addScaledVector(force, delta);
ball.position.addScaledVector(ball.velocity, delta);
}
function animate() {
if (ball.position.y >= 0) {
var posPrev = ball.position.clone();
updatePosition(1 / 60 / 5);
var posNext = ball.position.clone();
scene.add(createLine(posPrev, posNext, 5, 'red'));
}
controls.update();
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
function createLine(start, end, size, color) {
var line = new THREE.Object3D();
var distance = start.clone().sub(end).length();
var box = new THREE.Mesh(
new THREE.BoxGeometry(size, size, distance),
new THREE.MeshBasicMaterial({ color: color }));
box.position.z = distance / 2;
line.add(box);
line.position.copy(start);
line.lookAt(end);
return line;
}