// создание пирамиды из бочек
var rows = 5;
for (var i = 0; i < rows; i++) {
var cols = rows - i;
for (var j = 0; j < cols; j++) {
var position = new BABYLON.Vector3(
(j - (cols - 1) * 0.5) * 2,
(i + 0.5) * 3,
0
);
var barrel = BABYLON.MeshBuilder.CreateCylinder(
"barrel",
{ height: 3, diameterTop: 1.5, diameterBottom: 1.5 },
scene
);
barrel.position.copyFrom(position);
// установка физических свойств бочки
barrel.physicsImpostor = new BABYLON.PhysicsImpostor(
barrel,
BABYLON.PhysicsImpostor.CylinderImpostor,
{ mass: 105, friction: 0.5, restitution: 0 },
scene
);
}
}
// создание шарика
var inBall = BABYLON.MeshBuilder.CreateSphere(
"inBall",
{ diameter: 1 },
scene
);
inBall.position.y = 20;
// установка физических свойств шарика
inBall.physicsImpostor = new BABYLON.PhysicsImpostor(
inBall,
BABYLON.PhysicsImpostor.SphereImpostor,
{ mass: 1, friction: 0.5, restitution: 0 },
scene
);
// установка первоначального импульса движения шарика
inBall.physicsImpostor.applyImpulse(
new BABYLON.Vector3(0, 0, -50),
inBall.getAbsolutePosition()
);
// создание плоскости земли
var ground = BABYLON.MeshBuilder.CreateGround(
"ground",
{ width: 20, height: 20 },
scene
);
ground.position.y = -1;
// установка физических свойств земли
ground.physicsImpostor = new BABYLON.PhysicsImpostor(
ground,
BABYLON.PhysicsImpostor.BoxImpostor,
{ mass: 0, friction: 0.5, restitution: 0.7 },
scene
);
// регистрация обработчика столкновений шарика с землей
inBall.physicsImpostor.registerOnPhysicsCollide(
ground.physicsImpostor,
function(main, collided) {
console.log("Ball touched the ground!");
// остановка движения шарика при столкновении с землей
inBall.physicsImpostor.setLinearVelocity(new BABYLON.Vector3(0, 0, 0));
}
);