首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARKit -海报作为通往虚拟房间的窗口

ARKit -海报作为通往虚拟房间的窗口
EN

Stack Overflow用户
提问于 2019-11-28 12:22:36
回答 1查看 329关注 0票数 1

我正在使用iOS开发ARKit应用程序。

在现实世界里,墙上有一张海报。海报是一个固定的东西,所以任何需要的预处理都可以应用。

目的是让这张海报成为进入虚拟房间的窗口。这样,当用户接近海报时,他就可以“透过”到某个虚拟的3D环境(房间)。当然,用户不能通过“窗口”,然后在那个3D环境中漫游。他只能看到一个虚拟的房间“透过”海报。

我知道这张海报有可能被ARKit发现,并在它周围播放一些视觉效果,甚至在上面放一部电影。

但是我没有找到如何把它变成一个虚拟3D世界的窗口的信息。

任何想法和链接的样本项目将受到极大的赞赏。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-28 21:32:25

看看这段视频发布在增强图片网页(使用Chrome浏览器观看此视频)。

创建这种类型的虚拟立方体很容易。你所需要的只是一个没有前多边形的简单立方体基元的三维模型(为了看到它的内表面)。还有,你需要一架有方形孔的飞机。为这架飞机指定一个开箱即用的RealityKit遮挡材料或手工制作的SceneKit遮挡材料,它将隐藏它后面所有立方体的外墙(请看下面的图片)。

在Autodesk Maya中,遮挡材料是呈现统计中的延迟选项(仅适用于Viewport2.0):

当你在墙上跟踪你的海报时(激活了detectionImages选项),你的应用程序必须识别一张图片,并“加载”3D立方体及其遮挡阴影的掩蔽平面。因此,如果海报上的ARImageAnchor和三维立方体的pivot point必须满足,立方体的枢轴点必须位于立方体的前缘(与墙壁表面相同的水平上)。

如果你想下载苹果公司包含图像检测体验的示例代码,只需单击detectionImages网页上的一个蓝色按钮即可。

下面是我的代码的一个简短示例:

代码语言:javascript
复制
@IBOutlet var sceneView: ARSCNView!

override func viewDidLoad() {
    super.viewDidLoad()

    sceneView.delegate = self  // for using renderer() methods of ARSCNViewDelegate
    sceneView.scene = SCNScene()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    resetTrackingConfiguration()
}


func resetTrackingConfiguration() {

    guard let refImage = ARReferenceImage.referenceImages(inGroupNamed: "Poster", 
                                                                bundle: nil) 
    else { return }

    let config = ARWorldTrackingConfiguration()
    config.detectionImages = refImage
    config.maximumNumberOfTrackedImages = 1

    let options = [ARSession.RunOptions.removeExistingAnchors,
                   ARSession.RunOptions.resetTracking]

    sceneView.session.run(config, options: ARSession.RunOptions(options))
}

当然,...and是一个SceneKit的renderer()实例方法:

代码语言:javascript
复制
func renderer(_ renderer: SCNSceneRenderer,
             didAdd node: SCNNode,
              for anchor: ARAnchor) {

    guard let imageAnchor = anchor as? ARImageAnchor,
          let _ = imageAnchor.referenceImage.name 

    else { return }

    anchorsArray.append(imageAnchor)

    if anchorsArray.first != nil {
        node.addChildNode(portalNode)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59088813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档