Я думаю, вы должны использовать continuousCollisionDetectionThreshold
свойство экземпляра.Это значение дает минимальное расстояние, которое должно пройти тело, чтобы SceneKit применил более точный (но более дорогой) алгоритм для обнаружения контактов с другими телами.
var continuousCollisionDetectionThreshold: CGFloat { get set }
SceneKit'sфизический движок может использовать два вида обнаружения столкновений :
с обнаружением discrete collision
, когда SceneKit имитирует физику перед рендерингом каждогофрейм (см. timeStep и SCNSceneRendererDelegate ), он обновляет положение каждого физического тела на основе скорости тела в течение этого временного интервала,затем проверяет, пересекает ли тело в своем новом положении другие тела.
При обнаружении continuous collision
SceneKit вычисляет объем, которыйбудет проходить через тело в течение каждого кадра, а затем проверяет, пересекает ли этот объем другие тела.Значение этого свойства defaults to 0.0
, что всегда приводит к дискретному обнаружению столкновений.Когда это значение отлично от нуля, SceneKit применяет непрерывное столкновение всякий раз, когда тело проходит больше указанного расстояния в течение одного timeStep .
Дискретное обнаружение столкновений обеспечивает высокую производительность, но может привести к неточным результатам для небольших быстро движущихся тел.Непрерывное обнаружение столкновений сопряжено с затратами на производительность и работает только для фигур сферической физики, но обеспечивает более точные результаты.