旋转整个AR会话轴(与真实世界的西北向上对齐)



我正在尝试对我的整个AR会话应用旋转,以便AR会话世界坐标与现实世界的西北向上对齐。我使用的是Xcode 12.0.1。我试过用谷歌搜索这个,但没有找到我要找的东西。如有任何帮助或指出正确的主题,我们将不胜感激。(有其他地方可以张贴这个吗?(

我有一个函数,它接收真实世界的纬度/经度/海拔坐标,并返回X-Y-Z。这些X-Y-Z值似乎工作正常。也就是说,当纬度/经度在我的北方(在现实世界中(时,我在AR中绘制的球体在(会话世界轴的(正X轴上,而我以西的纬度/经度则在正Y轴上。到目前为止,一切都很好。

下一步是使AR会话世界坐标轴(X-Y-Z(与真实世界西北向上轴对齐。从会话开始时的坐标系来看(X和Z在水平面上,Y向上(,我似乎只应该做两个简单的旋转:绕X旋转-pi/2,使Y在水平面内,Z向上,然后绕新Z旋转,使X指向北方。

我的UIViewController中有一个ARSCNView。我有一个配置:

private let configuration = ARWorldTrackingConfiguration()

在viewDidLoad((中,我设置了调试选项来显示会话的坐标

self.asSceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, … ]

稍后(在viewDidLoad之后(,通过点击按钮,我调用一个函数,1(获取相机变换,2(对变换应用旋转,3(使用旋转后的变换来设置世界原点。

guard let transform = self.arSceneView.session.currentFrame?.camera.transform else {… }
let newMat = SCNMatrix4Rotate( SCNMatrix4( transform ), minus90, 1, 0, 0) // minus90 is in radians
self.arSceneView.session.setWorldOrigin( relativeTransform: sind_float4x4( newMat) )

结果是出现了一些奇怪的旋转/平移世界轴。它没有按照我认为的方式工作并不奇怪,但为了调试和理解它,我需要更好地理解这个过程。

问题1:camera.transform与setWorldOrigin?摄影机变换和世界原点之间的联系/关系是什么?在整个旋转过程中,我获取并打印了camera.transform,并且camera.transform从未改变——即使在使用不同的变换矩阵设置了worldOrigin之后也是如此。

问题2:camera.transform什么时候设置?你怎么知道的?一直到viewWillLoad(0和viewDidLoad((,我检查…camera.transform,它总是零。我添加了一个按钮,在会话开始后(当它不是零时(检查它(并旋转它(。我相信还有更好的方法。它是什么时候设置的?知道它何时设置的正确方法是什么?

问题3:关于轮换AR会议,还有其他建议吗?我的方法完全错误了吗?我应该使用不同的方法吗?我还应该寻找哪些其他主题或关键词?

谢谢,Rick

仅供参考:我还没有找到改变ARKit相机变换的方法,而且你不应该改变rootNode的变换(根据苹果公司的说法(,所以我通过在ARKit rootNode和我的场景的其余部分之间插入一个节点(我称之为myRootNode(来解决我的特殊问题。我绘制的所有元素节点都附加到myRootNode或myRootNode的子节点。我将旋转应用于myRootNode,然后场景中的所有东西都被旋转(除了ARKit WorldAxes,所以我还绘制了自己的(。

要使ARKit坐标(在运行ARSCNView会话时设置(与X北、Y西和Z向上对齐,我使用以下旋转:

// point X-axis in the right direction
let yRot = appleHeadingAtRunRad + Double.pi/2.0
var mat = SCNMatrix4Rotate(SCNMatrix4Identity, Float(yRot), 0, 1, 0)
// put Y-axis in plane parallel to ground, Z up
let xRot = -Double.pi/2.0
mat = SCNMatrix4Rotate(mat, Float(xRot), 1, 0, 0)
myRootNode.transform = mat

最新更新