swift - 将 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)
解决方案
根据我的经验,ARKitprojectPoint
函数给出的屏幕坐标在绘制到例如CALayer
. 这意味着它们遵循此处所述的 iOS 坐标,其中原点位于左上角,y 反转。
SpriteKit 有自己的坐标系:
单位坐标系将原点放置在框架的左下角,将 (1,1) 放置在框架的右上角。精灵的锚点默认为 (0.5,0.5),对应于帧的中心。
最后,SKNodes 被放置在其原点位于左下角的 SKScene 中。您应该确保您的 SKScene 与您的实际视图大小相同,否则原点可能不在视图的左下角,因此您从视图坐标中定位节点的位置可能不正确。这个问题的答案可能会有所帮助,特别是检查视图的 AspectFit 或 AspectFill 以确保您的场景被缩小。
场景的原点位于左下角,根据您的场景大小和缩放比例,它可能在屏幕外。这是 0,0 所在的位置。因此,您添加的每个孩子都将从那里开始,并根据位置向上和向上工作。SKSpriteNode 的原点位于中心。
因此,从视图坐标和 SpriteKit 坐标转换的两个基本步骤将是 1)反转 y 轴,使您的原点位于左下角,以及 2)确保您的 SKScene 框架与您的视图框架匹配。
如果有任何问题,我可以更全面地测试一下并编辑
推荐阅读
- regex - 使用 htaccess 编辑查询字符串
- vba - 如果 olMail.Body = str1 + str2,则更改 olMail.Body 字体名称和字体大小
- javascript - 在 mongoose schema.save 中更新 `let` 变量
- angularjs - AngularJS,嵌套数组
- linux - 如何在内核模块 Makefile 中提供包含目录路径
- reactjs - 如何生成 vendor.css 和 vendor.js 文件?
- java - JPA 检索带有空格的枚举
- python - 熊猫更改列日期格式
- ios - 在 UILabel iOS 中的点后显示带有两位小数的浮点值时遇到问题
- javascript - 如何防止 setInterval 函数在 Javascript 中执行两次?