首页 > 解决方案 > 将 ARFaceAnchor 与 SpriteKit 叠加层对齐

问题描述

ARFaceGeometry我正在尝试在特定几何点/上计算 SpriteKit 覆盖内容位置(不仅仅是覆盖视觉内容)ARFaceAnchor

SCNSceneRenderer.projectPoint从计算的世界坐标中使用,但结果是 y 反转并且未与相机图像对齐:

let vertex4 = vector_float4(0, 0, 0, 1)
let modelMatrix = faceAnchor.transform
let world_vertex4 = simd_mul(modelMatrix, vertex4)
let pt3 = SCNVector3(x: Float(world_vertex4.x),
                     y: Float(world_vertex4.y),
                     z: Float(world_vertex4.z))
let sprite_pt = renderer.projectPoint(pt3)

// To visualize sprite_pt
let dot = SKSpriteNode(imageNamed: "dot")
dot.size = CGSize(width: 7, height: 7)
dot.position = CGPoint(x: CGFloat(sprite_pt.x), 
                       y: CGFloat(sprite_pt.y))
overlayScene.addChild(dot)

标签: swiftsprite-kitscenekitarkitface

解决方案


根据我的经验,ARKitprojectPoint函数给出的屏幕坐标在绘制到例如CALayer. 这意味着它们遵循此处所述的 iOS 坐标,其中原点位于左上角,y 反转。

SpriteKit 有自己的坐标系

单位坐标系将原点放置在框架的左下角,将 (1,1) 放置在框架的右上角。精灵的锚点默认为 (0.5,0.5),对应于帧的中心。

最后,SKNodes 被放置在其原点位于左下角的 SKScene 中。您应该确保您的 SKScene 与您的实际视图大小相同,否则原点可能不在视图的左下角,因此您从视图坐标中定位节点的位置可能不正确。这个问题的答案可能会有所帮助,特别是检查视图的 AspectFit 或 AspectFill 以确保您的场景被缩小。

场景的原点位于左下角,根据您的场景大小和缩放比例,它可能在屏幕外。这是 0,0 所在的位置。因此,您添加的每个孩子都将从那里开始,并根据位置向上和向上工作。SKSpriteNode 的原点位于中心。

因此,从视图坐标和 SpriteKit 坐标转换的两个基本步骤将是 1)反转 y 轴,使您的原点位于左下角,以及 2)确保您的 SKScene 框架与您的视图框架匹配。

如果有任何问题,我可以更全面地测试一下并编辑


推荐阅读