Т.к. геометрия объектов простая и понятная — кубики — то я бы просто анализировал координаты. А именно после совершении очередного шага в строке 375 добавил бы
if ( checkCollision() ) {
controls.getObject().translateX( -velocity.x * delta );
controls.getObject().translateY( -velocity.y * delta );
controls.getObject().translateZ( -velocity.z * delta );
}
т.е. при обнаружении столкновения откатывался бы шаг назад. Функция определения столкновения:
function checkCollision() {
var collision = false;
for ( boх in objects ) { // Перебираем все кубики.
// Если оказались ближе 10 к центру кубика, значит мы оказались у него внутри, т.к. кубы там размером 20х20.
collision |= (
( Math.abs( box.postion.x - controls.getObject().position.x) < 10 ) &
( Math.abs( box.postion.y - controls.getObject().position.y) < 10 ) &
( Math.abs( box.postion.z - controls.getObject().position.z) < 10 )
);
}
return collision;
}
Код не проверял. С обнаружением границ мира примерно также. Думаю, справитесь.
Если объекты произвольной, но выпуклой формы, то тогда я бы из точки первого лица пускал бы два луча (raycast) в диаметрально противоположных направлениях. Потом анализировал объекты, которые они пересекли. Если один и тот же объект пересекли оба луча, значит мы оказались у него внутри.
С невыпуклыми телами сложнее, думать не хочу.