JavaScript, Matter.js: увеличение радиуса круга

У меня есть небольшой пример сценария, где у меня есть круг (радиус: 40), который падает на землю. Но когда я увеличиваю его радиус до 80, меняется только графика круга, но не физика:

<html>
<body></body>
</html>
<script src="matter.js"></script>
<script>
var Engine = Matter.Engine,
    World = Matter.World,
    Bodies = Matter.Bodies
engine = Engine.create(document.body,{render:{options:{wireframes: false}}})
engine.render.options.background = "#7f7f7f"
ground = Bodies.rectangle(400,590,800,20,{isStatic:true})
World.add(engine.world, ground)
circle = Bodies.circle(400,20,40,{render:{fillStyle:"#0000ff"}})
World.add(engine.world, circle)
Engine.run(engine)
setTimeout(increaseRadius, 1500)

function increaseRadius(){
  circle.circleRadius = 80
}
</script>

введите здесь описание изображения


person d0n.key    schedule 20.09.2015    source источник


Ответы (1)


Я предполагаю, что с вашим подходом вам также нужно снова вызвать World.add(engine.world, circle) и, возможно, удалить предыдущий круг с меньшим радиусом, поскольку движок работает с копией круга. Кроме того, вы можете вызвать метод масштабирования для тела: http://brm.io/matter-js-docs/classes/Body.html#method_scale

person benbo    schedule 20.09.2015
comment
Но тогда вся остальная физика исчезает, по крайней мере, если круг движется. Но я вижу, если я могу восстановить эти вещи.. - person d0n.key; 20.09.2015
comment
Я предполагаю, что нет указателя на глобальный круг, который вы создали, когда вы передаете его в мир, но создается его копия. Таким образом, когда вы меняете радиус круга, это не влияет на копию, которая фактически используется. - person benbo; 20.09.2015
comment
Вы можете вызвать метод масштабирования для тела: brm.io /matter-js-docs/classes/Body.html#method_scale - person benbo; 20.09.2015
comment
Спасибо! Пожалуйста, обновите сообщение, чтобы я мог оценить ответ - person d0n.key; 20.09.2015
comment
Кстати, прежде чем я открою для этого другую ветку, вы знаете способ поворота столкновения для одного тела? Чтобы он просто проходил через все остальные объекты? - person d0n.key; 20.09.2015
comment
Вы должны иметь возможность назначать другой идентификатор группы для тел, которые вы не хотите сталкивать brm.io/matter-js-docs/classes/Body.html#property_groupId - person benbo; 20.09.2015
comment
Давайте продолжим обсуждение в чате. - person d0n.key; 21.09.2015
comment
@benbo прав, вы должны использовать Body.scale, если вам нужно изменить размер тела после создания. Обратите внимание, что body.circleRadius используется только как подсказка для более плавного рендеринга круга. Что касается вашего вопроса об отключении столкновений, см. одно тело"> stackoverflow.com/questions/32683832/ - person liabru; 03.11.2015
comment
Другая проблема с удалением объекта во время цикла столкновений заключается в том, что если объект когда-либо сталкивается с двумя объектами одновременно, вы не сможете распознать объект, потому что он был удален из мира и, вероятно, ваши собственные ссылки, и вы, возможно, ищете новый объект. - person matthew.tuck; 10.06.2016