有没有办法让SCNNode总是在其他节点前面?

2023-11-22

我一直在尝试使用场景套件制作一个场景,其中指定的对象始终位于其他对象的前面,尽管事实上它实际上位于其他对象的后面。与此类似的效果用于blender.

显然,搅拌机使用 GUI 和大量数学来转换 2D 对象,但我需要在具有 SCNGeometry 的 SCNNode 中实现此效果,换句话说,当前位于场景中的 3D 对象。

我考虑过使用类别蒙版,但在阅读 Apple 的文档后,我意识到这不适用于我正在寻找的效果。

有谁知道在 SceneKit 中执行此操作的方法吗?或者更好的是,是否有可能做到这一点?

提前非常感谢大家,以及我从 StackExchange 获得的所有其他帮助!


正如我之前的答案中所解释的,接受的答案并不是最佳的,并且仅适用于广告牌、HUD 和其他通常平坦的物体(不一定完全是 2D)。当使用 3D 对象并禁用从深度缓冲区和上图中的对象读取时,它不会从每个角度正确渲染。即 3D 对象needs从深度缓冲区读取以检测其自身的像素和深度。综上所述,我给出了正确的答案:

SCN技术

简而言之,渲染 2 个额外通道。一个用于控制小控件 (DRAW_NODE),另一个用于通过另一通道将其与场景混合在一起(DRAW_QUAD,带有使用先前通道作为输入的着色器)。

以下是该 techique 的 scntec.plist 内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>passes</key>
    <dict>
        <key>gizmoonly</key>
        <dict>
            <key>colorStates</key>
            <dict>
                <key>clear</key>
                <true/>
                <key>clearColor</key>
                <string>0.5 0.5 0.5 0.0</string>
            </dict>
            <key>depthStates</key>
            <dict>
                <key>clear</key>
                <true/>
            </dict>
            <key>inputs</key>
            <dict>
                <key>colorSampler</key>
                <string>COLOR</string>
            </dict>
            <key>outputs</key>
            <dict>
                <key>color</key>
                <string>gizmonode</string>
            </dict>
            <key>draw</key>
            <string>DRAW_NODE</string>
            <key>node</key>
            <string>movegizmo</string>
        </dict>
        <key>quadscene</key>
        <dict>
            <key>colorStates</key>
            <dict>
                <key>clear</key>
                <true/>
                <key>clearColor</key>
                <string>sceneBackground</string>
            </dict>
            <key>depthStates</key>
            <dict>
                <key>clear</key>
                <true/>
            </dict>
            <key>inputs</key>
            <dict>
                <key>totalSceneO</key>
                <string>COLOR</string>
                <key>a_texcoord</key>
                <string>a_texcoord-symbol</string>
                <key>gizmoNodeO</key>
                <string>gizmonode</string>
            </dict>
            <key>outputs</key>
            <dict>
                <key>color</key>
                <string>COLOR</string>
            </dict>
            <key>draw</key>
            <string>DRAW_QUAD</string>
            <key>program</key>
            <string>gizmo</string>
        </dict>
    </dict>
    <key>sequence</key>
    <array>
        <string>gizmoonly</string>
        <string>quadscene</string>
    </array>
    <key>targets</key>
    <dict>
        <key>totalscene</key>
        <dict>
            <key>type</key>
            <string>color</string>
        </dict>
        <key>gizmonode</key>
        <dict>
            <key>type</key>
            <string>color</string>
        </dict>
    </dict>
    <key>symbols</key>
    <dict>
        <key>a_texcoord-symbol</key>
        <dict>
            <key>semantic</key>
            <string>texcoord</string>
        </dict>
        <key>vertexSymbol</key>
        <dict>
            <key>semantic</key>
            <string>vertex</string>
        </dict>
    </dict>
</dict>
</plist>

以下是第二遍的顶点着色器:

attribute vec4 a_position;
varying vec2 uv;

void main() {
    gl_Position = a_position;
    uv = (a_position.xy + 1.0) * 0.5;
}

第二遍的片段着色器:

uniform sampler2D totalSceneO;
uniform sampler2D gizmoNodeO;

varying vec2 uv;

void main() {
    vec4 t0 = texture2D(totalSceneO, uv);
    vec4 t1 = texture2D(gizmoNodeO, uv);
    gl_FragColor = (1.0 - t1.a) * t0 + t1.a * t1;
}

SWIFT代码:

if let path = NSBundle.mainBundle().pathForResource("scntec", ofType: "plist") {
            if let dico1 = NSDictionary(contentsOfFile: path)  {
                let dico = dico1 as! [String : AnyObject]

                let technique = SCNTechnique(dictionary:dico)
                scnView.technique = technique
            }
}

Objective-C 代码:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"scntec" withExtension:@"plist"];
SCNTechnique *technique = [SCNTechnique techniqueWithDictionary:[NSDictionary dictionaryWithContentsOfURL:url]];
    self.myView.technique = technique;

设置 Gizmo 节点的名称:

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

有没有办法让SCNNode总是在其他节点前面? 的相关文章

  • 如何将 GoogleAnalytics 标头导入到库框架中?

    我为我的项目创建一个库框架 我希望该框架能够依赖 Google Analytics 库 由于与应用程序目标不同 框架没有桥接标头 因此如何将标头导入到框架中 并且在框架的公共头文件中导入 Google Analytics 标头会产生其他意外
  • Swift - 如何使用 malloc?

    我正在尝试将 Objective C 应用程序转换为 Swift 但我不知道如何实现 malloc 可以在 Swift 中使用吗 谢谢 当您使用 Swift 中的 ObjC 或 C 时 您需要实现桥接标头 然后 桥接标头导出的函数可在 Sw
  • 在 SwiftUI 中使用获取视图的宽度

    我需要获取渲染视图的宽度SwiftUI 这显然没那么容易 我的看法是 我需要一个返回视图尺寸的函数 就这么简单 var body some View VStack alignment leading Text timer name font
  • 当我编写 FirebaseApp.configure() 时,iOS 应用程序崩溃

    我有一个 ios 应用程序 可以正常登录和 Facebook 登录 今天我集成了 firebase 当我在应用程序委托中编写 FirebaseApp configure 时 我的应用程序崩溃了 并且此函数突出显示错误代码 在展开可选值时意外
  • 检查文件是否是别名 Swift

    如何在 Mac 上检查文件是否为别名 到目前为止 这是我的代码 public func getFiles let folderPath Users timeBro Desktop testfolder let fileManager NSF
  • 如何使用 AVCaptureVideoPreviewLayer 从相机应用程序实现 2 倍变焦

    我的应用程序中有一个 AVCaptureVideoPreviewLaye 它运行良好 并且显示与相机应用程序相同的预览视频 我想实现相机应用程序的 2 倍变焦功能 我该怎么做呢 基本上 我希望我的预览层将视频源更改为与您在点击 1x 图标将
  • 在 DecodingError 中采用 CustomNSError

    我正在使用 Crashlytics 编写一个错误记录器 并且遇到了一个问题 这个问题让我质疑我对协议和动态调度的理解 使用 Crashlytics 记录非致命错误时 API 需要一个符合错误的对象和一个可选的用户信息字典 我现在正在查看 J
  • 如何使用 Swift 将文本复制到剪贴板/粘贴板

    我正在寻找一个干净的示例 说明如何将文本复制到 iOS 剪贴板 然后可以在其他应用程序中使用 粘贴 该功能的好处是可以快速复制文本 无需传统文本复制的标准文本突出显示功能 我假设关键课程位于UIPasteboard 但在中找不到相关区域他们
  • Swift:使用元组在单个 switch-case 中使用多个间隔

    有这样的代码 switch indexPath section indexPath row case 0 1 5 println in range default println not at all 问题是我可以在第二个元组值中使用多个间
  • iOS 9.3.2 破坏 MPMusicPlayerController

    我正在尝试将 Apple Music 集成到我的应用程序中 直到今天早上我才设法使其完美运行 更新到 iOS 9 3 2 后 一切都不一样了 权限系统的工作原理相同 SK云服务控制器 https developer apple com li
  • 使用 OneSignal/Firebase 从 iOS 设备发送推送通知

    我正在开发一个应用程序 并试图找出当不同用户执行特定操作时如何通知特定用户 我试图避免设置自己的后端服务器 因为我相信我想做的事情可以通过 OneSignal Firebase 来完成 我还没有尝试过 但我认为每个用户都可以获得自己的 On
  • 在 Pages 文稿中打开文本—Swift

    在我的 Swift 2 应用程序中 用户通过文本字段创建一串文本 然后将其共享给另一个应用程序 现在 我只能将文本共享为 txt 文件 这不提供选项Open In Pages当我打开系统共享对话框时 如何才能让用户可以选择将输入的文本作为
  • Swift 语言中的 #ifdef 替换

    在 C C Objective C 中 您可以使用编译器预处理器定义宏 此外 您可以使用编译器预处理器包含 排除代码的某些部分 ifdef DEBUG Debug only code endif Swift 中有类似的解决方案吗 是的 你可
  • 如何使用逗号和行分隔符对字符串进行标记

    我正在 Swift 中制作一个简单的 String Tokenizer 就像在 Java 中一样 但这对我来说确实不起作用 我的数据源中每行的末尾用 分隔 数据用逗号分隔 例如 字符串 1 字符串 2 字符串 3 字符串 1 字符串 2 字
  • 无法在 xcode 8 beta 6 上编译 AWS CustomIdentityProvider

    我在 iOS 应用程序中使用 Amazon Cognito 和 Facebook 登录 直到 beta 5 为止此代码从这个SO线程 https stackoverflow com questions 37597388 aws cognit
  • Swift PageControl 当前页面上更大的点

    我试图将当前页面的点缩放为大于未 选择 的点 我正在使用滚动视图委托来确定哪个页面是当前的 目前 点的大小没有变化 我将如何实现这一目标 func scrollViewDidEndDecelerating scrollView UIScro
  • 使用 PDFOutline 将 TOC 添加到 Swift/Cocoa 中的 PDFDocument

    我正在开发一个小程序 将多个单页 PDF 合并到一个多页 PDF 中 我正在 Swift4 MacOS Cocoa 中工作 但我一生都无法在 Swift 中找到任何类型的示例来创建大纲 仅遍历现有的大纲 我对此非常熟悉 使用对文档的最佳猜测
  • Swift - 保存在 TableView 中选择的复选标记

    我对 Swift 相当陌生 并且在 TableView 多重选择方面遇到问题 我有多个选择 可以用复选标记进行检查 类似于待办事项列表 当我检查项目时 我希望能够返回 ListView 并保存我的选择 我假设将其保持在已保存状态的代码将位于
  • TestFlight 安装的应用程序因 Swift 包管理器依赖项而崩溃

    我们已经迁移了一些 CocoaPod 依赖项 以便在 Xcode 11 中使用 Swift Package Manager 进行构建和链接 但是 每当我们将应用程序提交到 AppStore Connect 并使用 TestFlight 进行
  • 从 URL 解析 JSON 最终出现错误 - Swift 5

    我正在尝试用 swift 编写一个函数 从 URL JSON 获取数据 并将其分配给 swift 中的变量 这是函数 func getBikeData guard let url URL string https api citybik e

随机推荐

  • css 浮动及其堆栈顺序

    我正在回顾之前学过的 float 属性 我发现了一个关于浮动元素及其自己的堆叠顺序的简单问题 代码如下 示例1 box 1 background teal width 100px height 100px float left div cl
  • 有没有办法在正则表达式中执行动态替换?

    有没有办法在 C 4 0 中使用匹配中包含的文本函数进行正则表达式替换 在php中有这样的东西 reg replace hello world yay s randomfunction 0 它为每场比赛提供独立的结果 并在找到每场比赛的地方
  • “DS:[40207A]”在汇编中是什么意思?

    0040103A CALL DWORD PTR DS 40207A USER32 MessageBoxA 什么是DS mean 该指令正在从内存加载新的 EIP 值ds 40207A 即地址处有一个函数指针40207A 它推送一个返回地址
  • 将内容插入 iFrame

    我试图将一些内容插入到 空白 iFrame 中 但是没有插入任何内容 HTML JS iframe ready function var doc iframe contentWindow document var body text Tes
  • Kendo-ui MVC PopUp 编辑器:如何隐藏字段

    我正在使用 Kendo ASP NET MVC 我想对编辑表单进行一些控制 我想做的事情 隐藏我的 ID 字段 将我的属性代码和平方英尺更改为常规 TextBoxFor 字段 将购买日期和销售日期更改为 Kendo DatePickerFo
  • 使用 Comet/XMPP 与 Microsoft 堆栈上的 WebSocket 技术进行实时 Web 通知和更新的选项?

    我正在为一个项目确定架构选项 该项目将呈现用户活动 登录 照片等 的实时更新 如 Facebook 该项目的两个主要 UI 组件是一个自动更新滚动区域 其中将列出新通知 照片 等 以及一个将更新消息计数等内容的工具栏 其竞争者是基于 Jab
  • 仅允许大写和小写字母

    我只想接受用户的小写和大写字母 我尝试了下面的代码 它回显了无效字符消息 但不起作用 我的意思是它不检查 它只是显示消息 有什么帮助吗
  • d3.js 中折叠/展开树的子节点?

    我正在构建一个树结构 或者更确切地说 使用我自己的 json 中的一组数据修改其中一个示例 并且我正在尝试创建一些功能 我的树的布局是树示例中的布局 http mbostock github com d3 ex cluster html 我
  • Mathematica 快速 2D 分箱算法

    我在 Mathematica 中开发适当快速的分箱算法时遇到一些麻烦 我有一个很大的 100k 元素 数据集 其形式为 T x1 y1 z1 x2 y2 z2 我想将其分入大约 100x100 个 bin 的 2D 数组中 bin 值由每个
  • super 函数在 Maya python 模块中不起作用

    不知何故 这在 Maya Python 脚本编辑器中工作正常 但在我的模块代码内部时失败 有人有主意吗 class ControlShape object def init self args kwargs print Inside Con
  • mysql 别名的未知列问题

    我不明白为什么当该列是创建的别名时我会得到一个未知列 任何帮助都会很棒 code SELECT DISTINCT c id SUM c width feet 12 SUM c width inches AS width SUM c heig
  • 通过多个活动传递数据

    1 是我的第一个活动 主要 2 是我的第二项活动 3 是我的第三项活动 我想从 1 运行 2 然后形成 2 运行 3 然后从 3 获取数据并将其返回到 1 希望大家能理解 这是我的代码 像这样运行 2 form 1 Intent inten
  • Java RSA 中字符串中的密钥

    我在我的应用程序中使用 RSA 加密技术 为了存储生成的公钥 我将其转换为字符串 然后将其保存在数据库中 Key publicKey null Key privateKey null KeyPair keyPair RsaCrypto ge
  • 删除子图中的死角,同时保留标题和标签

    您好 我在 matlab 中遇到问题 我想创建一个包含 10 个子图的图形 2X5 方向 但问题是我想减少它们之间的死角区域 我还需要保留第一行图像的标题 xlabel 和第二行图像的 xlabel 仅 不需要 ylabel 到目前为止 我
  • Visual Studio 2015 无法与 Apache Cordova 工具一起使用

    我完整安装了 VS 2015 Enterprise Tools for Apache Cordova 当我打开或创建任何项目时 它不会构建 甚至不会在 运行 按钮上显示 Ripple 模拟器或设备信息 我已经完全重新安装了 但还是一样 当我
  • 使用网络音频 api 播放简单的声音

    我一直在尝试按照一些教程中的步骤使用按钮通过网络音频 API 播放简单的编码本地 wav 或 mp3 文件 我的代码如下 testAudioAPI js window AudioContext window AudioContext win
  • 关于何时应该将直接缓冲区与 Java NIO 一起用于网络 I/O 的简单规则?

    具有以简单直接的方式解释复杂事物的天赋的人可以解决这个问题吗 使用 Java NIO 进行网络 I O 时 为了获得最佳性能 何时应使用直接 ByteBuffer 与常规 ByteBuffer 例如 我应该读入堆缓冲区并从那里解析它 执行多
  • Postgres:找不到适用于 jdbc 的驱动程序

    我知道这可能与此处发布的问题重复 抱歉 这是我为数据库连接编写的代码 try Class forName org postgresql Driver catch ClassNotFoundException e e printStackTr
  • 如何在 numpy 和 R 之间传递大型数组?

    我正在使用 python 和 numpy scipy 为文本处理应用程序执行正则表达式和词干提取 但我也想使用 R 的一些统计包 将数据从 python 传递到 R 的最佳方法是什么 然后回来 另外 我需要在某个时候将数组备份到磁盘 所以如
  • 有没有办法让SCNNode总是在其他节点前面?

    我一直在尝试使用场景套件制作一个场景 其中指定的对象始终位于其他对象的前面 尽管事实上它实际上位于其他对象的后面 与此类似的效果用于blender 显然 搅拌机使用 GUI 和大量数学来转换 2D 对象 但我需要在具有 SCNGeometr