我正在创建一个锚,并将其添加到我的ARSKView中,在相机前的一定距离处,如下所示:
func displayToken(distance: Float) {
print("token dropped at: \(distance)")
guard let sceneView = self.view as? ARSKView else {
return
}
// Create anchor using the camera's current position
if let currentFrame = sceneView.session.currentFrame {
// Create a transform with a translation of x meters in front of the camera
var translation = matrix_identity_float4x4
translation.columns.3.z = -distance
let transform = simd_mul(currentFrame.camera.transform, translation)
// Add a new anchor to the session
let anchor = ARAnchor(transform: transform)
sceneView.session.add(anchor: anchor)
}
}然后为锚点创建节点,如下所示:
func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
// Create and configure a node for the anchor added to the view's session.
if let image = tokenImage {
let texture = SKTexture(image: image)
let tokenImageNode = SKSpriteNode(texture: texture)
tokenImageNode.name = "token"
return tokenImageNode
} else {
return nil
}
}这工作得很好,我看到图像被添加到适当的距离。然而,我想要做的是计算当你移动时锚点/节点在相机前有多远。问题是,使用fabs(cameraZ - anchor.transform.columns.3.z)似乎可以立即停止计算。请参阅我的代码,该代码位于update()方法中,用于计算相机和对象之间的距离:
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
guard let sceneView = self.view as? ARSKView else {
return
}
if let currentFrame = sceneView.session.currentFrame {
let cameraZ = currentFrame.camera.transform.columns.3.z
for anchor in currentFrame.anchors {
if let spriteNode = sceneView.node(for: anchor), spriteNode.name == "token", intersects(spriteNode) {
// token is within the camera view
//print("token is within camera view from update method")
print("DISTANCE BETWEEN CAMERA AND TOKEN: \(fabs(cameraZ - anchor.transform.columns.3.z))")
print(cameraZ)
print(anchor.transform.columns.3.z)
}
}
}
}感谢任何帮助,以便准确地获得相机和锚之间的距离。
发布于 2018-06-21 01:52:55
4x4变换矩阵的最后一列是平移向量(或相对于父坐标空间的位置),因此只需减去这些向量即可获得两个变换之间的三维距离。
let anchorPosition = anchor.transforms.columns.3
let cameraPosition = camera.transform.columns.3
// here’s a line connecting the two points, which might be useful for other things
let cameraToAnchor = cameraPosition - anchorPosition
// and here’s just the scalar distance
let distance = length(cameraToAnchor)你所做的是不正确的,因为你正在减去每个向量的z坐标。如果这两个点在x、y和z上不同,那么只减去z并不能得到距离。
发布于 2018-06-20 13:14:33
这个是为scenekit准备的,不过我还是把它留在这里吧。
let end = node.presentation.worldPosition
let start = sceneView.pointOfView?.worldPosition
let dx = (end?.x)! - (start?.x)!
let dy = (end?.y)! - (start?.y)!
let dz = (end?.z)! - (start?.z)!
let distance = sqrt(pow(dx,2)+pow(dy,2)+pow(dz,2))发布于 2020-07-29 08:41:54
对于RealityKit,有一种略微不同的方法来实现这一点。如果您正在使用世界跟踪配置,那么您的AnchorEntity对象将符合HasAnchoring,这将为您提供一个target。目标是AnchoringComponent.Target的枚举。它有一个case .world(let transform)。您可以将您的世界变换与摄影机的世界变换进行比较,如下所示:
if case let AnchoringComponent.Target.world(transform) = yourAnchorEntity.anchoring.target {
let theDistance = distance(transform.columns.3, frame.camera.transform.columns.3)
}这花了我一点时间才弄明白,但我认为其他可能正在使用RealityKit的人可能会从中受益。
https://stackoverflow.com/questions/50937214
复制相似问题