swift - 如何在 ARKit 中获取相机位置和图像对象位置之间的角度和距离?
问题描述
在 AR 应用程序上工作,一旦跟踪图像并放置 3d 模型,我需要将对象放置在 ARImageAnchor 上,然后它不应该与图像锚一起移动,它应该只跟随 iPhone 上的相机角度并与锚点的距离。
尝试了很多代码。
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let node = SCNNode()
if let imageAnchor = anchor as? ARImageAnchor {
self.mainNode.simdTransform = anchor.transform
self.sceneView.scene.rootNode.addChildNode(self.mainNode)
}
另一个尝试:
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
let node = SCNNode()
if let imageAnchor = anchor as? ARImageAnchor {
guard let pointOfView = self.sceneView.pointOfView else { return }
let transform = pointOfView.transform
self.mainNode.transform = transform
self.sceneView.scene.rootNode.addChildNode(self.mainNode)
}
func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
guard let pointOfView = self.sceneView.pointOfView else { return }
let transform = pointOfView.transform
let translationMatrix = SCNMatrix4Translate(transform, 1.0 , -0.5, -3.0)
}
无法理解如何获取 pointOfView 变换和 Anchor.transform 之间的距离和角度。任何帮助将不胜感激。提前致谢。
解决方案
您需要使用相机变换和/或 eulerAngle:
let cameraTransform = self.sceneView.session.currentFrame.camera.transform
let cameraEulerAngle = self.sceneView.session.currentFrame.camera.eulerAngle
cameraTransform 是一个 4x4 矩阵,如果你想要单个坐标,你需要得到第三列:
let x = cameraTransform.columns.3.x
let y = cameraTransform.columns.3.y
let x = cameraTransform.columns.3.z
这是三轴坐标。
cameraEulerAngle 是一个 3x3 矩阵,你可以得到:
- 俯仰(x 旋转)
- 偏航(y 旋转)
- 滚动(z 旋转)
let angleX = cameraEulerAngle.x
let angleY = cameraEulerAngle.y
let angleZ = cameraEulerAngle.z
如果您希望节点位于相机前面,您需要使用相机 X、Y 坐标并给出 Z 值,即距相机的距离(以米为单位)。请注意,如果您想要更精确,则需要根据相机旋转在轴坐标上添加偏移量。
您可以在此处 和此处获取更多信息(ARCamera)
推荐阅读
- mysql - 如何根据其他列的结果运行 SELECT 语句?
- reactjs - 如何在反应中使用onload?
- gitlab - gitlab推送规则,允许一个特定文件gradle-wrapper.jar
- android - Android 受限权限
- c# - 在 C# 中无法获取 PowerShell 命令的结果
- r - 将关键字与一系列文本评论匹配
- loops - 为什么我的计数器尽管增加却是负数?
- javascript - 循环遍历 JSON 以按键对值进行分组
- react-native - React Native 检测手机屏幕是否关闭
- sql-server - SQL Server 表在没有架构的情况下不显示 [Jetbrains Datagrip]