如何使用SceneKit编辑器创建AR Portal效果?

2023-12-07

我想创建一个原型像这个:仅使用 Xcode SceneKit 编辑器。我找到了一个answer房间是通过简单的编程方式创建的SCNPlane对象并调整渲染顺序。

但是,我想整合一些更详细的内容,例如下载房间的 3D 模型,并使其只能通过门户访问。我试图直接在 Xcode 的 SceneKit 编辑器中转换此部分来实现相同的效果:

// a. Create The Left Wall And Set its Rendering Order To 200 
// Meaning It Will Be Rendered After Our Masks
let leftWallNode = SCNNode()
let leftWallMainGeometry = SCNPlane(width: 0.5, height: 1)
leftWallNode.geometry = leftWallMainGeometry
leftWallMainGeometry.firstMaterial?.diffuse.contents = UIColor.red
leftWallMainGeometry.firstMaterial?.isDoubleSided = true
leftWallNode.renderingOrder = 200

// b. Create The Left Wall Mask And Set its Rendering Order To 10 
// Meaning It Will Be Rendered Before Our Walls
let leftWallMaskNode = SCNNode()
let leftWallMaskGeometry = SCNPlane(width: 0.5, height: 1)
leftWallMaskNode.geometry = leftWallMaskGeometry
leftWallMaskGeometry.firstMaterial?.diffuse.contents = UIColor.blue
leftWallMaskGeometry.firstMaterial?.isDoubleSided = true
leftWallMaskGeometry.firstMaterial?.transparency = 0.0000001
leftWallMaskNode.renderingOrder = 10
leftWallMaskNode.position = SCNVector3(0, 0, 0.001)

在编辑器中分成两个平面:

SceneKit Editor

我负责设置isDoubleSided and renderingOrder对于它们两个,我将第二个设为透明(在漫反射颜色上使用 alpha)。

不幸的是,当以 AR 模式显示时,它不起作用。


ARKit + 场景套件

enter image description here

ARPortal 类场景中的虚拟世界必须通过 3D 墙来阻挡用户。这面墙必须有一个开口,即入口所在,通过它您将看到门户的 3D 对象。墙体的材质是Occlusion材料。这种类型的材料是无形的隐藏在其后面渲染的 3D 对象的材质,但显示来自 iPhone 的 AR 摄像头的视频。 SceneKit 没有现成的这样的材质,所以让我们来创建它。

enter image description here

此代码展示了如何以编程方式将遮挡材质分配给 SceneKit 对象:

portalPlane.geometry?.materials.first?.colorBufferWriteMask = [] 
portalPlane.geometry?.materials.first?.readsFromDepthBuffer = true
portalPlane.geometry?.materials.first?.writesToDepthBuffer = true
portalPlane.renderingOrder = -100

此图显示了如何在 Xcode 的 Material Inspector 中设置属性:

enter image description here

下图显示了如何在 Node Inspector 中设置属性:

enter image description here

另一方面,要退出门户,您需要一个 3D 对象,例如门。门的多边形法线应指向内,带有开口的墙壁的多边形法线应指向外。这两个物体的材质都是单面的。

现实套件

在 RealityKit 中,您可以开箱即用地使用遮挡材质。

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

如何使用SceneKit编辑器创建AR Portal效果? 的相关文章

随机推荐

  • Vue SFC 样式未在 webpack 生产构建中提取

    尝试将 vue 和 SFC 添加到我的 webpack 应用程序中 这
  • stringr包中的Perl正则表达式

    The perl 最新版本的 stringr 中不推荐使用该函数 而是使用regex 但是 我似乎无法复制早期的行为 要将字符串向量的第一个字母大写 可以使用以下方法 name lt c jim john bill str replace
  • 如何在 iPhone 上将一张图像与另一张图像进行比较,看看它们是否有一定比例的相似度?

    我基本上想用 iPhone 或 iPad 2 上的相机拍摄两张图像 然后将它们相互比较 看看它们是否几乎相同 显然 由于光线等原因 图像永远不会完全相同 因此我想检查大约 90 的兼容性 我在这里看到的所有其他类似的问题要么不是针对 iOS
  • 通过调用方法将字符串传递给属性参数

    我正在尝试使用 NUnit 并将字符串参数传递给 TestCase 属性 但我得到 属性参数必须是属性参数类型的常量表达式 typeof 表达式或数组创建表达式 这是一个简化版本 但 MyStatic 是一个返回构建的 RegEx 字符串的
  • 在 Hyperledger 结构中动态添加组织或组织中的对等方

    我在用http hyperledger fabric doc readthedocs io en latest getting started html用于 Ubuntu VM 中的 Hyperledger Fabric 设置 根据教程 f
  • 在 Postgres 中将表从一个数据库复制到另一个数据库

    我正在尝试将整个表从一个数据库复制到 Postgres 中的另一个数据库 有什么建议么 提取表并将其直接通过管道传输到目标数据库 pg dump t table to copy source db psql target db Note 如
  • 在 CRM 2011 中禁用系统功能区

    我想使用 javascript 有条件地禁用 CRM 2011 表单中的系统功能区 AddNew 这意味着如果 statusCode 是 X 或 Y 禁用功能区 我该怎么做 我尝试获取功能区的 ID 以便将功能区的类名更改为禁用 但我得到
  • 使用局部变量提升精神

    我想根据先前解析的值定义一个规则 即 e 输入字符串具有以下结构 D
  • 使用 google picker 打开特定的 MimeType

    我正在使用实时 API 并且正在使用 realtime client utils 使用现有代码 我使用此方法创建实时文件 createRealtimeFile function title callback gapi client load
  • .apply(Math, arrayName) 在 JS 中如何工作?

    有more than one关于如何在 javascript 中查找值数组的最小值或最大值的 stackoverflow 问题 这不是那个问题 我想知道为什么路过 apply 奇怪的事情this论证仍然有效 尽管一篇好博文从 Aaron C
  • 使用 Maven 管理 DLL 依赖项

    我有一个 Java 程序 使用 Maven 管理其依赖项 其中一个依赖项是另一个程序的 JNI 包装器 Maven 负责对相关 JAR 文件的引用 但我自己却在处理 DLL 文件 有没有好的方法让 Maven 也处理 DLL 理想情况下 我
  • 如何清除所有用户的会话?

    我在我的项目中使用 php 会话 我更新了代码 向会话添加了一些值 现在我需要清除所有现有会话 ps 我的操作系统是ubuntu 9 04 默认情况下 PHP 会话信息存储在 tmp 下的文件中 文件名通常以 sess 为前缀 因此删除这些
  • lxml classic:获取除嵌套标签之外的文本内容?

    这一定是绝对的经典 但我在这里找不到答案 我正在使用 lxml cssselect 解析以下标签 li a href stations 1 span class num 3 span Detroit a li 我想获取的内容 li tag
  • 如何在python中搜索文件夹名称并将其删除

    我有一个文件夹和子文件夹的目录 我需要搜索它以找到某个文件夹名称 旧数据 以便我可以删除 旧数据 中的文件并删除文件夹本身及其中的文件 但是不是它的父文件夹 有 122 个文件夹可供搜索 其中只有一些文件夹包含名为 旧数据 的子文件夹 如何
  • 找不到 CFBundle CertUIFramework.axbundle 的可执行文件

    刚刚更新到 Xcode 5 这是它在我所有应用程序的记录器上抛出的第一个错误 似乎无法理解为什么会发生这种情况 2013 09 19 10 46 54 341 MyApp 1156 a0b Cannot find executable fo
  • 将我自己的参数发送到事件处理程序?

    我正在专门使用 AssemblyResolve 首先是我的代码 然后我的问题如下 var a AppDomain CurrentDomain a AssemblyResolve new ResolveEventHandler HandleI
  • JQuery具有特定类的多个html表格单元格的总和

    我有一个包含许多行的 HTML 表格 每行都有一个单元格 sum类 我如何计算所有单元格的总和 sum class total sum of td with sum class table tr td Name 1 td td Desc 1
  • 根据背景颜色获取值的总和 - Google 表格

    可以在谷歌表格中根据如下格式对一行数据求和 sumif a1 d1 if background is green 解释 我认为实现你的目标的唯一方法是使用谷歌应用脚 本特别是自定义功能 自定义函数如下totalColor cells col
  • 异步方法正确吗?修磨机警告

    在我的方法中RecalcChartAsync我做了一些时间密集的事情 所以我想我会异步做一些事情 我想启动这两个方法CreateHistogramAsync CalculatePropValuesAsync同时在我的中做一些事情Recalc
  • 如何使用SceneKit编辑器创建AR Portal效果?

    我想创建一个原型像这个 仅使用 Xcode SceneKit 编辑器 我找到了一个answer房间是通过简单的编程方式创建的SCNPlane对象并调整渲染顺序 但是 我想整合一些更详细的内容 例如下载房间的 3D 模型 并使其只能通过门户访