我正在工作的游戏,支持正常的游戏和虚拟现实使用SceneKit。在正常播放时,我有一个SCNView,一个摄像头,它也对应于视点音频侦听器。当切换到VR模式时,我将屏幕分割成两个SCNView,它们都是从两个不同的摄像机播放相同的场景,而音频侦听器位于它们之间,这里没有问题。
在我的游戏中,我需要位置音频,所以我使用SCNAudioSuorce使用一个SCNAction来播放声音效果,但是由于相同的场景在两个视图中都在播放,我怎么能使其中一个静音,而音频只来自另一个呢?我已经搜索了网络和文档,但是没有发现任何关于这个的东西。
iOS 11 Update:在iOS 11上测试我的应用程序并尝试在VR模式下播放声音之后,该应用程序在__UpdateAudioTransform的呈现队列线程上崩溃,因为我播放该声音,将其从动作(包括其他节点转换)中删除,使游戏运行良好。
更新1:多亏@rickster的建议,我尝试实现了一个SCNTechnique,并在下面的苹果文档中得到了以下内容
SCNTechnique(dictionary: [
"passes" : [
"leftView": [
"draw": "DRAW_SCENE",
"pointOfView": stereoCameraLeftName,
"viewport": "(0, 0, 400, 400)"
],
"rightView": [
"draw": "DRAW_SCENE",
"pointOfView": stereoCameraRightName,
"viewport": "(200, 0, 400, 400)"
]
],
"sequence": [ "leftView", "rightView" ]
])其中,stereoCameraLeftName和stereoCameraRightName在其他地方被定义为字符串,并用作包含相应摄像机和视图的节点的名称,维度仅用于测试。当我将这种技术应用到场景中时,它不起作用,根据场景pointOfView的设置方式,我要么看到整个场景中充满了背景颜色(pointOfView设置为用于非VR模式的相机,不再链接到场景图形),要么看到使用两个摄像机中的一个(pointOfView设置为nil)呈现的全部大小,我遗漏了什么?
更新2:经过一些试验和错误之后,我发现为自定义视图定义简单传递的正确方法是这样的,w和h被定义为CGFloat
let technique = SCNTechnique(dictionary: [
"passes" : [
"leftView": [
"outputs": [ "color": "COLOR" ],
"draw": "DRAW_SCENE",
"colorStates": [
"clear": true,
"clearColor": "sceneBackground"
],
"pointOfView": stereoCameraLeftName,
"viewport": "0 0 \(w) \(h)"
],
"rightView": [
"outputs": [ "color": "COLOR" ],
"draw": "DRAW_SCENE",
"colorStates": [
"clear": false
],
"pointOfView": stereoCameraRightName,
"viewport": "\(w) 0 \(w) \(h)",
"blendStates": [
"colorOp": "add",
"alphaOp": "add"
]
]
],
"sequence": [ "leftView", "rightView" ]
])但是有一个问题:当第二次通过时,屏幕的左边仍然是黑色(清晰的颜色),而右边是正确的,如果我排除了这一次,只留下第一次,左侧就会正确地呈现,右边会出现与预期的场景背景颜色相同的情况。奇怪的是,如果没有在运行iPhone 11的iOS 6s上进行测试,而是在模拟器(iOS 11)上进行测试,那么我肯定在将这两次测试结合在一起时遗漏了一些东西。
更新2.1:从第二次传递中删除blendStates的提供了相同的结果。
更新3:试图重新创建一个MWE以重新创建问题--我发现我的方法是正确的,我将尝试调查我项目的其他部分,以找出问题所在。
最终更新:问题似乎是由视图中的反别名导致的,禁用它可以使SCNTechnique正常工作,就像iOS 11的一个bug,我已经提交了一份错误报告。
发布于 2017-09-25 20:31:23
这是试图在多个视图中呈现相同场景的一系列问题之一。(其他包括性能和并发性。)相反,它可能是一个更好的选择,只使用一个视图,并使用SCNTechnique渲染视图的场景两次。
当您配置一种技术时,您可以为每一张抽签单分别设置pointOfView --如果您要寻找立体声分离,这可能会非常方便。
您还可以为每次传递设置viewport。如果你在做某种立体声渲染,你可以用这个让一个渲染过程覆盖视图的一半,另一个渲染传递覆盖另一半。
https://stackoverflow.com/questions/45417930
复制相似问题