从 didAdd 锚点获取 ARAnchor 的轮换



所以我使用session(_ session: ARSession, didAdd anchors: [ARAnchor]来获取所有检测到的飞机(我不能使用renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)因为我使用的是RealityKit而不是ARKit(。

所以我的问题是,如何从这种方法中获得检测到的锚点的旋转?我想创建一个平面实体,该实体与检测到的锚点具有完全相同的位置、大小、方向和旋转。到目前为止,我使用范围作为大小,中心作为位置,但我无法弄清楚如何获得旋转。因为现在它检测到正确(正确的位置和大小(,但旋转错误,真正的平面。

您可以从 ARPlaneAnchor 的 transform 属性中获取其位置和方向,然后使用它在 RealityKit 中呈现边界平面。

extension float4x4 {
/// Returns the translation components of the matrix
func toTranslation() -> SIMD3<Float> {
return [self[3,0], self[3,1], self[3,2]]
}
/// Returns a quaternion representing the 
/// rotation component of the matrix
func toQuaternion() -> simd_quatf {
return simd_quatf(self)
}
}
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let planeAnchor = anchors[0] as? ARPlaneAnchor else {
return
}
// NOTE: When the ARPlaneAnchor is first created its transform
// contains the position and the plane.center == [0,0,0]. On updates
// the plane.center will change as the extents of the plane change.
let position = planeAnchor.transform.toTranslation()
let orientation = planeAnchor.transform.toQuaternion()
// The center is a position before the orientation is taken in to
// account, so we need to rotate it  to get the true position before
// we add it to the anchors position
let rotatedCenter = orientation.act(planeAnchor.center)
// You have a ModelEntity that you created earlier
// e.g. modelEntity
// Assuming you added the entity to an anchor that is just 
// fixed at 0,0,0 in the world, or you created a custom entity
// with HasAnchor set to 0,0,0
modelEntity.transform.translation = position + rotatedCenter
modelEntity.transform.rotation = orientation
// Doesn't seem to be a way to update meshes in RealityKit so
// just create a new plane mesh for the updated dimensions
modelEntity.model?.mesh = MeshResource.generatePlane(
width: planeAnchor.extent.x, 
depth: planeAnchor.extent.z
)
}

最新更新