three.js testbed
with orbitControls, XZgrid, info
by tommy92380
HTML
<div id="info">hw2
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js">
</script>
<script src="https://jyunming-chen.github.io/tutsplus/js/KeyboardState.js"></script>
CSS
#info {
position: absolute;
top: 0px;
width: 100%;
padding: 10px;
text-align: center;
color: #ffff00
}
body {
overflow: hidden;
}
JavaScript
class Ball {
constructor (mesh, rad = 2, color) {
this.pos = new THREE.Vector3()
this.vel = new THREE.Vector3()
this.force = new THREE.Vector3()
this.mesh = mesh;
this.radius = rad;
this.light = new THREE.PointLight (color, 1, 50);
scene.add (this.light)
scene.add (this.mesh) // add to scene when particle is created
console.log (color)
this.mesh.material.color.copy ( color.clone() );
}
update (dt) {
this.vel.add (this.force.clone().multiplyScalar (dt))
this.pos.add (this.vel.clone().multiplyScalar(dt))
this.collidingPlanes (planes)
// simple collision
/*
if (this.pos.z > 100 - this.radius) {
const CR = 0.9
this.pos.z = 100 - this.radius
this.vel.z = - CR * this.vel.z;
}
*/
this.mesh.position.copy (this.pos)
this.light.position.copy (this.pos)
this.light.position.y += 20
}
collidingPlanes (planes) {
const EPS = 1e-3
const CR = 0.96
for (let i = 0; i < planes.length; i++) {
let plane = planes[i]
let point = this.pos.clone().sub (plane.ptOnPl)
if ( point.dot(plane.normal) < EPS + this.radius) {
// position correction
this.pos.copy (plane.ptOnPl.clone().add (point.projectOnPlane(plane.normal)) )
this.pos.add (plane.normal.clone().multiplyScalar(this.radius))
// velocity update
this.vel.sub (plane.normal.clone().multiplyScalar ((1+CR)*this.vel.dot(plane.normal)))
//return; // assume particle collides with AT MOST one plane
}
}
}
}
function pucksBumping(pucks) {
var x_dist, z_dist, center_dist, double_real_center_dist;
var vel1, vel2, pos1, pos2, vel1_prime, vel2_prime;
var part1, part2, part3;
const posAdjustValue = 11.11;
for (var count = 0; count < (balls.length - 1); count++) {
for (var count2 = count + 1; count2 < balls.length; count2++) {
x_dist = pucks[count].pos.x - pucks[count2].pos.x;
z_dist = pucks[count].pos.z - pucks[count2].pos.z;
...