Intereting Posts
iOS 8 – Локализация отображаемого имени виджета Инициализация Наследование путаницы Файл префикса iOS: Включает NSManagedObjects (классы с генерированием основных данных) В чем причина частой коррумпированной / неполной загрузки с Amazon CDN на устройства iOS? AFNetworking 3.0 продолжает загрузку, когда приложение перемещается на задний план Руководство по управлению памятью вручную Почему переменная типа id <someProtocol> не может принимать параметр id <otherProtocol>, даже если «otherProtocol» соответствует «someProtocol»? Как большая, распространенная компания должна работать с iOS Developer Program? Приложение запрашивает логин при каждом запуске после попытки восстановления продуктов Позиционирование маркеров местоположения в верхней части местоположения? Ошибка в NSDateComponents weekOfYear IOS конвертирует часы в секундах из NSString Методы AVAssetResourceLoaderDelegate переопределяют loadRequest Может ли связка ключей на устройстве iOS сохранять что-либо, отличное от NSString? Запретить прокрутку веб-страницы при двойном нажатии на UIWebView

Странное встряхивание с шарнирным соединением в наборе сцен

я пытаюсь объединиться, танк с башней, но из-за этой совместной цельной модели тряска, есть ли у вас какие-либо идеи, что вызывает такое поведение?

Ссылка на проект: Проект

вот как я это сделал:

SCNNode *tankNode = [extraScene.rootNode childNodeWithName:@"Main_Body" recursively:YES]; [tankNode setScale:SCNVector3Make(0.003, 0.003, 0.003)]; [tankNode setPosition:SCNVector3Make(0, 1, 0)]; [tankNode setPhysicsBody:[SCNPhysicsBody dynamicBody]]; [tankNode setRotation:SCNVector4Make(0, 1, 0, -M_PI_2)]; [scene.rootNode addChildNode:tankNode]; SCNNode *turretNode = [tankNode childNodeWithName:@"Turret" recursively:YES]; turretNode.physicsBody = [SCNPhysicsBody staticBody]; SCNNode *gunNode = [turretNode childNodeWithName:@"gun" recursively:YES]; gunNode.physicsBody = [SCNPhysicsBody staticBody]; SCNPhysicsHingeJoint *gunJoint = [SCNPhysicsHingeJoint jointWithBodyA:turretNode.physicsBody axisA:SCNVector3Make(0,0,1) anchorA:SCNVector3Make(0.1,0.1,0.1) bodyB:gunNode.physicsBody axisB:SCNVector3Make(0,0,1) anchorB:SCNVector3Make(0.1,0.1,0.1)]; [scene.physicsWorld addBehavior:gunJoint]; SCNPhysicsHingeJoint *turretJoint = [SCNPhysicsHingeJoint jointWithBodyA:turretNode.physicsBody axisA:SCNVector3Make(0,1,0) anchorA:SCNVector3Make(0.1,0.1,0.1) bodyB:tankNode.physicsBody axisB:SCNVector3Make(0,1,0) anchorB:SCNVector3Make(0.5,0.5,-0.1)]; [scene.physicsWorld addBehavior:turretJoint]; 

Я думаю, что есть две проблемы:

  • вы назначаете ограничение между узлом и одним из его дочернего узла (башня и резервуар). Это вряд ли даст ожидаемые результаты, поскольку положение дочернего узла относительно его родителя (так что предположим, что ограничение перемещает родительский узел, оно также перемещает дочерний узел).
  • вы назначаете ограничение между двумя статическими телами (gun & turret) – это не должно иметь никакого эффекта

Im только угадывая здесь, но я бы предположил, что вы размещаете совместное физическое тело tankNode из-за того, что вы масштабировали tankNode, но не его физическую форму.

Помните, что масштабирование SCNNode не масштабирует его физическую форму. Если вам нужно, чтобы ваш танк был масштабирован: убедитесь, что вы также масштабируете физический корпус – SCNVector3 Scale=SCNVector3Make(0.003, 0.003, 0.003);

Тогда ваша физическая форма должна быть масштабирована:

 NSDictionary *options=[NSDictionary dictionaryWithObject: [NSValue valueWithSCNVector3:Scale] forKey:SCNPhysicsShapeScaleKey]; 

Теперь создайте физическое тело из масштабированной формы:

 SCNPhysicsShape *physicsGeometry=[SCNPhysicsShape shapeWithGeometry:tankNode.geometry options:options]; 

Наконец, добавьте физическую форму в ваш резервуар

 tankNode.physicsBody=[SCNPhysicsBody bodyWithType:SCNPhysicsBodyTypeDynamic shape:physicsGeometry]; 

Ваш физический корпус и узел резервуара теперь имеют одинаковый размер.

Если вам нужна физика на пушке и башне, то есть пушка должна столкнуться, создайте ее физическое тело так же.

Ваш код подскажет, что башня и пистолет – дети танков. Лучший / самый простой способ – выставить башню на пистолет, чтобы пистолет был ребенком башни, а затем вывел башню в резервуар. Таким образом, перемещение танка перемещает пистолет, башню и резервуар, перемещение башни перемещает башню и пистолет, а перемещение пистолета только перемещает пистолет.
Также в своем программном обеспечении для 3D-разработки не забудьте переместить поворот на необходимый центр вращения для каждого узла (или установить его с помощью свойства SCNNode.pivot).

В этом случае вам вообще не понадобится использовать суставы, если правильная иерархия родителей / детей:

Надеюсь, это поможет.