如何在另一个场景中显示某一部分场景(Scene Kit + Swift)

3
首先,我想向大家介绍我的问题,因为它非常复杂,所以您需要完全理解它。
我正在尝试使用Scene Kit和Swift做一些事情:我想要再现我们可以在电视节目Doctor Who中看到的情况,即博士的飞船内部比外部更大,就像您可以在此视频中看到的那样。
当然,Scene Kit Framework不支持此类虚幻维度,因此我们需要做一些手脚才能实现它。
现在让我们用简单的英语谈谈我的想法
实际上,我们想要做的是在同一位置显示两种完全不同的维度;所以我想:
- 一个用于飞船内部的第一维; - 第二个用于飞船外部的维数。
现在,假设您在船外,您将处于“外部维度”,在这个外部维度中,我的目标是在门口展示内部维度的一部分,以产生摄像机在外面但我们清楚地可以看到内部更大的效果。 我们将从内部使用等效原则。 现在让我们谈谈游戏逻辑
我认为表示这些维度的好方法是使用两个场景。我们将称外部场景为外部,内部场景为内部。 因此,如果我们再次看图片,这在场景级别会是这样的:
The same image than before, here, all the outside of the ship is colored in green, and the inside that we can see by the doors is colored in yellow, actually the green parts of the images represents the outsideScene (this is the scene that we are in), and the yellow parts (the rectangle of the open doors) represents the insideScene, I want to display this scene in the outsideScene 要使其看起来逼真,内部视图需要跟随外部摄像机的移动,这就是为什么我认为这两个相机的所有属性都必须相同的原因: enter image description here
enter image description here 左侧是外部场景,右侧是内部场景。 我用橙色表示摄像机视野。

如果外部场景相机向右移动,内部场景相机将完全执行相同的操作,如果外部场景相机旋转,内部场景相机将以相同的方式旋转...你明白原理了。

那么我的问题是:我可以使用什么来遮盖某个场景的某个部分(在这种情况下是外部视图中的黄色区域),并使用另一个视图(内部视图)的相机“看到”的内容?
起初,我认为我可以简单地从内部场景中获取NSImage,然后将其放置在外部场景中的一个表面上作为纹理,但问题是Scene Kit将计算其透视、光照等等...所以它看起来只像我们正在显示屏幕上的东西,而这不是我想要的。

2个回答

1

在SceneKit中,没有超级简单的方法可以实现这一点。

如果你的“内部场景”是静态的,并且可以被制作成立方体贴图,你可以使用着色器修改器和一种叫做内部映射的技术(你可以在网上轻松找到例子)。

如果你需要一个实时的、交互式的“内部场景”,你也可以使用相同的技术,但必须先将你的场景渲染到纹理中(或者使用模板依次渲染内部场景和外部场景)。这可以通过利用SCNTechnique(在Yosemite和iOS 8中新添加的)来完成。在旧版本中,你将不得不在SCNSceneRenderer委托方法中编写一些OpenGL代码。


非常感谢您的回答,我是一个雄心勃勃的初学者,希望能够尽快使用SCNTechnique。我阅读了相关文档,并看到了“includeCategoryMask”和“excludeCategoryMask”,这是我应该使用的吗? - Pop Flamingo
但是为什么我不能在实时场景中使用着色器修改器呢? - Pop Flamingo
对于静态场景,着色器修饰符是您唯一需要的工具。如果您想显示实时场景,则它们可能不足(但仍然有用),因为首先您还必须找到一种将实时场景绘制在GL纹理中的方法。 - mnuages
好的,我明白了。我基本上知道如何使用Scene Kit,但是我不知道OpenGL/GLSL的任何内容,你知道我可以从哪里开始吗? - Pop Flamingo

0

我不知道它是否“困难”。因为在iOS中,很多时候最简单的答案…就是最简单的答案。

也许考虑一下这个:

将纹理映射到由Tardis立方体形状的几何描述的圆柱体扇区。确保圆柱体半径等于相机的焦点。确保跟踪相机至焦点。

纹理会因为是圆柱体弯曲到立方体上而被扭曲。Tardis中的演员节点将对相机做出正确反应,但应该有两组光源...一组用于Tardis内部,一组用于Tardis外部。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接