Как заставить картину прилипать к стене? - PullRequest
1 голос
/ 25 апреля 2020

Я использую arkit и realitykit, сначала загружаю комнату, затем ставлю картинку на стену, но как позволить ей прилипнуть к стене? как получить правильное вращение картинки? Есть четыре варианта, передняя стенка: z +, z-, x +, x -,

red frame is wrong,it should be yellow

1 Ответ

0 голосов
/ 27 апреля 2020

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 преобразуются и поворачиваются относительно родительского узла. или сущность.

Итак, в вашем случае у вас есть большая модель, в которую вы планируете помещать более мелкие объекты.

У вас есть два варианта, либо использовать обнаружение касаний на большой модели (доме), и они вручную вычисляют, где должен быть расположен объект, что может быть довольно громоздким.

Другой вариант - добавить небольшие прозрачные плоскости в предопределенных положениях, а затем добавление обнаружения касаний на них. Таким образом, вы можете опустить расчет того, где меньший объект должен быть размещен

Удачи!

...