Tube Physics Body действует как SCNCylinder, но как заставить его работать как SCNTube?

Я пытаюсь сделать трубу и ее физическое тело в SceneKit.

let BoxGeometry = SCNTube(innerRadius: 5, outerRadius: 12.5, height: 4)
Box = SCNNode(geometry: BoxGeometry)
Box.pivot = SCNMatrix4MakeRotation(Float(M_PI_2/8), 0, 1, 0)
Box.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Static, shape: nil)
Box.physicsBody?.mass = 5
Box.categoryBitMask = colorCategory
scene.rootNode.addChildNode(Box)

Однако когда на этот объект падает другой объект, он не проходит через центр. Вместо этого он сидит, как будто парит в воздухе. Он действует так, как будто физическое тело представляет собой полный цилиндр, а не трубку с отверстием посередине. Как я могу исправить это, чтобы объекты могли проходить через центр? Внешний вид трубок выглядит так, как и ожидалось.

Спасибо!


person T Neate    schedule 10.12.2014    source источник
comment
Точка стиля: Swift предпочитает, но не применяет, чтобы имена InitialCapCamelCase использовались для типов (классов, структур, перечислений, протоколов). Для лучшего взаимодействия с различными инструментами и лучшей читабельности для обмена кодом с другими используйте нижний CamelCase для имен переменных/констант: let boxGeometry, box = SCNNode и т. д.   -  person rickster    schedule 11.12.2014


Ответы (2)


Динамические тела в SceneKit должны быть выпуклыми. (Если вы изучите общую теорию обнаружения столкновений в играх, то есть не только в SceneKit, вы обнаружите огромные различия в скорости и эффективности между обнаружением столкновений на выпуклых и вогнутых формах.) имеет в нем дырку.

К счастью, ваша трубка используется как статическое тело. Только для статических тел есть возможность сделать физическую форму (аппроксимацию) вогнутой геометрией:

let shape = SCNPhysicsShape(geometry: tube, 
    options: [SCNPhysicsShapeTypeKey: SCNPhysicsShapeTypeConcavePolyhedron])
box.physicsBody = SCNPhysicsBody(type: .Static, shape: shape)

Это связано с затратами на производительность. Если после этого изменения вы обнаружите, что ваша частота кадров ограничена использованием ЦП, или если вы хотите, чтобы динамическое тело было (эффективно) вогнутым, вы можете повысить производительность, создав физическую форму, которая представляет собой соединение нескольких других форм, например. создайте фиктивную иерархию узлов (не ту, которая на самом деле есть в вашей сцене), содержащую кучу цилиндров или ящиков, расположенных в кольцо, а затем создайте из них физическую форму с помощью SCNPhycsicsShape(node:options:).

person rickster    schedule 10.12.2014
comment
Приношу свои извинения, тело было статично для целей тестирования, цель состоит в том, чтобы сделать его динамичным. - person T Neate; 11.12.2014
comment
Затем вам нужно будет использовать соединение выпуклых форм, чтобы приблизиться к вашей вогнутой форме, как указано в конце моего ответа. - person rickster; 11.12.2014
comment
У меня сложилось впечатление, что параметры работают только для статики? - person T Neate; 11.12.2014
comment
SCNPhysicsShapeTypeConcavePolyhedron работает только для статики. Для динамики вы можете построить составную фигуру из нескольких узлов/форм с помощью SCNPhycsicsShape(node:options:) — эти формы должны быть выпуклыми (и предпочтительно иметь базовые геометрические формы, такие как сфера, прямоугольник и т. д.), но вместе они могут образовывать вогнутое расположение фигур. - person rickster; 11.12.2014
comment
Не могли бы вы помочь мне, как обнаружить столкновение, если мяч проходит через объект. вот вопрос stackoverflow .com/questions/51135793/ - person Prashant Tukadiya; 02.07.2018

Измените форму вашего физического тела, чтобы она соответствовала геометрии вашей трубки.

person tetuje    schedule 10.12.2014