我正在使用iOS开发ARKit应用程序。
在现实世界里,墙上有一张海报。海报是一个固定的东西,所以任何需要的预处理都可以应用。
目的是让这张海报成为进入虚拟房间的窗口。这样,当用户接近海报时,他就可以“透过”到某个虚拟的3D环境(房间)。当然,用户不能通过“窗口”,然后在那个3D环境中漫游。他只能看到一个虚拟的房间“透过”海报。
我知道这张海报有可能被ARKit发现,并在它周围播放一些视觉效果,甚至在上面放一部电影。
但是我没有找到如何把它变成一个虚拟3D世界的窗口的信息。
任何想法和链接的样本项目将受到极大的赞赏。
发布于 2019-11-28 21:32:25
看看这段视频发布在增强图片网页(使用Chrome浏览器观看此视频)。
创建这种类型的虚拟立方体很容易。你所需要的只是一个没有前多边形的简单立方体基元的三维模型(为了看到它的内表面)。还有,你需要一架有方形孔的飞机。为这架飞机指定一个开箱即用的RealityKit遮挡材料或手工制作的SceneKit遮挡材料,它将隐藏它后面所有立方体的外墙(请看下面的图片)。
在Autodesk Maya中,遮挡材料是呈现统计中的延迟选项(仅适用于Viewport2.0):

当你在墙上跟踪你的海报时(激活了detectionImages选项),你的应用程序必须识别一张图片,并“加载”3D立方体及其遮挡阴影的掩蔽平面。因此,如果海报上的ARImageAnchor和三维立方体的pivot point必须满足,立方体的枢轴点必须位于立方体的前缘(与墙壁表面相同的水平上)。
如果你想下载苹果公司包含图像检测体验的示例代码,只需单击detectionImages网页上的一个蓝色按钮即可。
下面是我的代码的一个简短示例:
@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()实例方法:
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)
}
}https://stackoverflow.com/questions/59088813
复制相似问题