将 3D 对象添加到 ARGeoAnchor

2024-06-06

如果这个问题不太好,请原谅我。我在 Apple 的 ARGeoAnchor 文档中遇到了一些障碍。

目前,ARGeoAnchor 仅在 AR 场景视图中显示一个蓝点。我正在尝试显示任何 3D 渲染或对象。

My code:

let coordinate = CLLocationCoordinate2D(latitude: lat, longitude: lng)
let geoAnchor = ARGeoAnchor(name: "Point 1", coordinate: coordinate)
    
let boxGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
let cube = SCNNode(geometry: boxGeometry)
geoAnchor.scene.rootNode.addChildNode(cube)
self.addGeoAnchor(geoAnchor)

我收到的错误:Value of type 'ARGeoAnchor' has no member 'scene'

我有多个 ARGeoAnchor,它们当前都显示蓝点。我如何让它们显示自定义 3D 对象?

谢谢参观!


首先你必须检查是否ARGeoTrackingConfiguration您的设备支持。

要求:您需要配备 A12+ 芯片并支持蜂窝 (GPS) 的设备。

import ARKit

@main class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, 
                       didFinishLaunchingWithOptions launchOptions: 
                                      [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        if !ARGeoTrackingConfiguration.isSupported {

            let sb = UIStoryboard(name: "Main", bundle: nil)

            window?.rootViewController = sb.instantiateViewController(withIdentifier:
                                                             "unsupportedConfiguration")
        }
        return true
    }
}

...然后检查您所在位置是否可以使用地理跟踪:

ARGeoTrackingConfiguration.checkAvailability { (available, error) in

    if !available {
        let errorDescription = error?.localizedDescription ?? ""
        let recommendation = "You need a place where geo tracking is supported."
        let restart = UIAlertAction(title: "Restart", style: .default) { (_) in
            self.restartSession()
        }
        self.alertUser(withTitle: "Geo tracking unavailable",
                         message: "\(errorDescription)\n\(recommendation)",
                         actions: [restart])
    }
}

供应之后Info.plist with camera and 位置权限。这里有一个全面的信息定位服务授权请求 https://developer.apple.com/documentation/corelocation/requesting_authorization_for_location_services包括:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysAndWhenInUseUsageDescription
  • NSLocationUsageDescription
  • NSLocationAlwaysUsageDescription

目前仅支持美国、英国、澳大利亚、加拿大、日本和新加坡的几个城市......

支持 ARGeoTrackingConfiguration 的城市列表 https://developer.apple.com/documentation/arkit/argeotrackingconfiguration.

然后您必须运行地理配置:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    let config = ARGeoTrackingConfiguration()
    sceneView.session.run(config)
}

然后将参数化锚点添加到会话中:

@IBOutlet var sceneView: ARSCNView!

override func viewDidLoad() {
    super.viewDidLoad()
    sceneView.delegate = self
    sceneView.scene = SCNScene()
    
    let coordinate = CLLocationCoordinate2D(latitude: 40.730610, 
                                           longitude: -73.935242)

    let geoAnchor = ARGeoAnchor(name: "Geo Anchor",
                          coordinate: coordinate,
                            altitude: 33.0)
    
    sceneView.session.add(anchor: geoAnchor)
}

之后,您可以在 ARGeoAnchor 的帮助下添加模型:

extension ViewController: ARSCNViewDelegate {
    
    func renderer(_ renderer: SCNSceneRenderer,
                 didAdd node: SCNNode,
                  for anchor: ARAnchor) {
            
        guard let geoAnchor = anchor as? ARGeoAnchor,
                  geoAnchor.name == "Geo Anchor"
        else { return }
        
        print(geoAnchor.coordinate)
                
        let boxGeometry = SCNBox(width: 1.0,
                                height: 1.0,
                                length: 1.0,
                         chamferRadius: 0.1)

        boxGeometry.firstMaterial?.diffuse.contents = UIColor.red

        let cube = SCNNode(geometry: boxGeometry)
        
        node.addChildNode(cube)
    }
}

P.S.

如果您对 ARCore 中类似功能的工作原理感兴趣,请阅读我的文章地理空间API https://stackoverflow.com/questions/50382855/arcore-and-sceneform-with-geolocation/72213814#72213814.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 3D 对象添加到 ARGeoAnchor 的相关文章

随机推荐

  • 如何将 ComboBox 添加到 ASP.NET 未绑定的 GridView

    我想知道如何将 ComboBox 列添加到未绑定的 GridView通过运行时的代码 以编程方式 我过去使用过以下实现 ITemplate 的类 但用于 DropDown 和 CheckBox 绑定 public class AddTemp
  • Maven:如何使用不同的属性值多次过滤同一资源?

    我们的项目使用 Log4J 通过 log4j properties 文件进行配置 我们有多个生产服务器 将日志记录到不同的日志文件中 这样可以区分日志 因此节点 1 的 log4j properties 如下所示 log4j appende
  • MATLAB 中时间戳过滤器的优化 - 处理非常大的数据集

    我正在 MATLAB 中编写一个程序 必须使用 MATLAB 并且不能真正使用 MEX 来过滤大量数据 我需要实现的过滤器之一要求我将时间戳向量与其他时间戳不会出现的已知 不良 时间列表进行比较 一个典型的时间戳向量有大约 2 000 00
  • Jquery可排序“更改”事件元素位置

    有没有办法让助手的当前位置被拖到新位置上 sortable sortable start function event ui var currPos1 ui item index change function event ui var c
  • C# 应用程序 GUI 和命令行

    我目前有一个带有 GUI 的应用程序 是否可以从命令行使用相同的应用程序 没有 GUI 并使用参数 或者我是否必须为命令行工具创建一个单独的 exe 和应用程序 编辑您的项目属性以使您的应用程序成为 Windows 应用程序 而不是 控制台
  • 根据注册后的时间自动删除Wordpress用户?

    在使用用户访问管理器的基本 WordPress 3 1 设置中 是否可以自动删除 x 天前的用户 我没有找到此功能的插件 人们将如何实施这一举措 我是否能够使用 sql 或 php 查询设置一个 cron 作业 从而每天自动从数据库中删除
  • 将 swift 结构体转换为 json 字符串

    我正在尝试将我的 swift 结构转换为 json 格式 类似这样的问题似乎有不少 但到目前为止 没有一个解决方案对我有用 这是我的结构 struct Rec Codable var name String var time Int var
  • Pandas:按天打破日期时间间隔

    我有一个带有日期时间间隔的 DataFrame 如下所示 id start date end date 1 1 2016 10 01 00 00 00 2016 10 01 03 00 00 2 1 2016 10 03 05 30 00
  • 在 VB6 中计时函数/测量性能的最佳方法是什么?

    如果我只想快速测量特定函数花费的时间 我可以调用什么来获得准确的计时 鉴于VB6计时函数精度不高 是否可以调用Windows API函数 您还通过哪些其他方式衡量应用程序性能 有推荐的第三方工具吗 我通常使用 Windows 高分辨率性能计
  • 双向链表中的成员访问

    我目前正在阅读 编程 使用 C 的原理与实践 的第 17 章 但我无法弄清楚 在下面的代码中 该行的作用是什么norse gods gt succ gt prev norse gods实际上呢 我知道 gt 是一个成员访问运算符 给定一个指
  • Impala:如何查询具有不同模式的多个镶木地板文件

    在 Spark 2 1 中我经常使用类似的东西 df spark read parquet path to my files parquet 即使具有不同的模式 也可以加载镶木地板文件的文件夹 然后我使用 SparkSQL 对数据帧执行一些
  • 将矩形分组到网格中

    我有一个随机切片的矩形网格 宽度为 80 单位 我已经将网格每一行的可用空间存储在如下数组中 pX 1 sX 15 pX 30 sX 13 pX 43 sX 1 pX 44 sX 17 pX 1 sX 15 pX 16 sX 14 pX 3
  • AWS S3 生成签名 URL“AccessDenied”

    我正在使用 NodeJs 将文件上传到 AWS S3 我希望客户端能够安全地下载文件 因此 我尝试生成签名 URL 该 URL 在使用一次后就会过期 我的代码如下所示 上传中 const s3bucket new AWS S3 access
  • (colorPrimaryDark) 状态栏颜色在 android v21 上不起作用?

    我在 style xml 上添加了 colorPrimaryDark 但状态栏 android v21 上的颜色没有受到影响 我有一个自定义工具栏 我在 style xml 代码中不使用操作栏主题 如果有任何解决方案请帮助我吗 样式代码
  • 检查片段是否存在并重用它

    每次用户单击列表视图中的项目时 我都会使用以下代码创建一个片段 但通过这种方式 片段是在每次用户点击时创建的 我想要的是重用旧片段 如果存在 并仅重新加载其内容 不创建新片段 MagazineViewFragment fragment ne
  • $.each() 内的 setTimeout

    好的 所以我有这个代码 this find article loading each function i var el this setTimeout function el replaceWith dumpster article fi
  • AngularJS - 为什么使用“控制器作为虚拟机”?

    整个周末 我都很苦恼 不明白为什么子控制器无法识别父控制器的功能 我很快意识到将我的控制器作为虚拟机是原因 div div div div div div 当然 现在看来很明显 child1 和 2 都不会看到 ParentCtrl 中的函
  • 在 Javafx 中单击内部时,透明舞台不应最小化

    我正在学习在 JavaFx 中创建屏幕录制应用程序 我希望用户调整矩形的大小来决定屏幕捕获区域 我已将舞台和场景设为透明primaryStage initStyle StageStyle TRANSPARENT and scene setF
  • 如何为 nls 函数找到良好的起始值?

    我不明白为什么我不能对这些数据使用 nls 函数 我尝试过很多不同的起始值 但总是出现相同的错误 这是我一直在做的事情 expFct2 function x a b c a 1 exp x b c vec x lt c 77 87 87 7
  • 将 3D 对象添加到 ARGeoAnchor

    如果这个问题不太好 请原谅我 我在 Apple 的 ARGeoAnchor 文档中遇到了一些障碍 目前 ARGeoAnchor 仅在 AR 场景视图中显示一个蓝点 我正在尝试显示任何 3D 渲染或对象 My code let coordin