SceneKit
Отвечая на ваш первый вопрос, чтобы привязать узел к определенному месту, нужно просто сохранить желаемое место и добавить узел, он не должен исчезнуть, если вы его не удалите. При изменении ориентации и положения телефона он может немного сдвинуться вверх и вниз, но не сильно
node.position = SCNVector3(x, y, z)
Если вы используете касания для определения местоположения, я бы порекомендовал вам рассмотреть sceneView.hitTest()
и touchesBegan () functions
Что касается вращения, вы можете просто использовать углы Эйлера на интересующем вас узле вдоль любой оси и в любом необходимом направлении
node.eulerAngles.x = -.pi / 2
Также я очень рекомендую вам «Разработка приложений со Swift» от Apple Education, 2019. В этой книге есть целая глава по ARKit, кроме ответов на ваши вопросы, в ней есть множество полезных приемов и идей
Здесь вы можете найти реализацию управляемого проекта в конце главы из книги «Разработка приложений с помощью Swift», но сделать это самостоятельно было бы гораздо полезнее
RealityKit
Как указано здесь , вы можете использовать один из двух вариантов вращения
let boxAnchor = try! Experience.loadBox()
boxAnchor.steelBox?.orientation = simd_quatf(angle: .pi/4, axis: [0, 0, 1])
Для свойства угла вы указываете, сколько вы хотите повернуть e объект в радианах, а для свойства оси вы выбираете ось, вокруг которой хотите вращаться.
Другой вариант - использовать преобразование
boxAnchor.steelBox?.transform = Transform(pitch: 0, yaw: 0, roll: .pi/4)
Roll, Pitch и Yaw представляют вращение вдоль определенной оси больше написано здесь .
Чтобы изменить позицию, вы можете снова использовать перевод преобразования
steelBox.transform.translation = [0, 0, -0.5]
Это переведет ваш объект в соответствии с заданным параметры. Эта функция в значительной степени зависит от аффинных преобразований .
Относительно преобразований с другими объектами
Узлы в SceneKit, а также сущности в RealityKit преобразуются и поворачиваются относительно родительского узла. или сущность.
Итак, в вашем случае у вас есть большая модель, в которую вы планируете помещать более мелкие объекты.
У вас есть два варианта, либо использовать обнаружение касаний на большой модели (доме), и они вручную вычисляют, где должен быть расположен объект, что может быть довольно громоздким.
Другой вариант - добавить небольшие прозрачные плоскости в предопределенных положениях, а затем добавление обнаружения касаний на них. Таким образом, вы можете опустить расчет того, где меньший объект должен быть размещен
Удачи!