Я использую ARKit для измерения комнат, но начало координат часто располагается под неправильным углом и не совсем параллельно полу. Я хотел бы настроить worldOrigin так, чтобы он вращался параллельно горизонтальным плоскостям, найденным с помощью функции ARKit planeDetection. Большие плоскости увеличат точность угла начала координат и, следовательно, улучшат качество облака точек, полученного из сеанса.
Я создал SCNPlane, размещенный на координатных осях xz (пол ARKit), и также использую каждый найденный якорь плоскости с достаточно большим размером, чтобы переориентировать worldOrigin, но не могу заставить его работать должным образом и / или возникают проблемы с конвертацией. кватернионы к simd4x4_float.
Мой код:
if plane.type == "floor" && isBigEnough == true {
let planeOrientation = plane.planeNode.simdOrientation
let originOrientationxz = originPlaneNodexz.simdOrientation
let changeOrientationxz = planeOrientation-originOrientationxz
var turn = SCNQuaternion(x: changeOrientationxz.axis.x, y: changeOrientationxz.axis.y, z: changeOrientationxz.axis.z, w: changeOrientationxz.angle)
sceneView.session.setWorldOrigin(relativeTransform: <#T##simd_float4x4#>)
//alternative idea
originPlaneNodexz.rotate(by: turn, aroundTarget: originPlaneNodexz.position)
//if this work, do:
for point in featurePointsArray{
point.rotate(by: turn, aroundTarget: SCN3Vector3(0,0,0)
}
Альтернативные идеи также приветствуются.