3

首先,我只想向你们介绍我的问题,因为它真的很复杂,所以你需要这个来正确理解它。
我正在尝试使用 Scene Kit 和 Swift 做一些事情:我想重现我们在电视节目Doctor Who中看到的内容,其中医生的宇宙飞船内部更大,正如您在此视频中看到的那样。
当然,Scene Kit 框架不支持那种不真实的维度,所以我们需要做一些hackery 来实现它。

现在用通俗的英语说一下我的想法,
其实我们要做的就是在同一个地方展示两个完全不同的维度;所以我在想:

  • 宇宙飞船内部的第一个维度。
  • 宇宙飞船外部的第二个维度。

现在,假设您在船外,您将在外部维度中,并且在这个外部维度中,我的目标是在门的水平面上显示内部维度的一部分,以产生这种效果,其中相机在外面,但我们可以清楚地看到里面更大: 我们可以看到一艘宇宙飞船(看起来像一个警察局),这艘船很小但是我们可以通过这些敞开的门看到这艘船的内部,里面看起来比里面大得多
我们将从内部使用等效原理。

现在让我们谈谈游戏逻辑:
我认为表示这些维度的一个好方法是两个使用两个场景。 我们将 outsideScene 称为外部场景,将 insideScene 称为内部场景
因此,如果我们再次拍摄照片,这将在场景级别给出: 和之前一样的图,这里,船的外面全部涂成绿色,而我们通过门看到的里面涂成黄色,实际上图像的绿色部分代表了外面的场景(这是场景我们在),黄色部分(打开的门的矩形)代表insideScene,我想在outsideScene中显示这个场景

为了让它看起来更逼真,内部的视图需要跟随外部摄像机的运动,这就是为什么我认为这两个摄像机的所有属性都是相同的: 在此处输入图像描述
在此处输入图像描述

左边是outsideScene,右边是insideScene。我用橙色表示相机视野

如果outsideScene 相机向右移动,insideScene 相机会做同样的事情,如果outsideScene 相机旋转,insideScene 相机也会以同样的方式旋转……你懂的原理。

所以,我的问题如下:我可以用什么来掩盖某个场景的某个部分(在这种情况下是outsideView中的黄色区域)与另一个视图(insideView)的相机“看到”什么?
首先,我认为我可以简单地从 insideScene 获取 NSImage,然后将其作为表面的纹理放在 outsideScene 中,但问题是 Scene Kit 会计算它的透视、照明等......所以它只会看起来我们正在屏幕上显示一些东西,这不是我想要的。

4

2 回答 2

1

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

如果您的“内部场景”是静态的并且可以烘焙到立方体贴图纹理中,您可以使用着色器修改器和一种称为内部映射的技术(您可以在网络上轻松找到示例)。

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

于 2014-07-20T14:25:14.257 回答
0

我不知道这是否“困难”。正如我们在 iOS 中所必须的那样,很多时候最简单的答案......就是最简单的答案。

也许考虑一下:

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

纹理将被扭曲,因为它是一个圆柱体,制作成一个立方体。Tardis 中的演员节点将对相机做出适当的反应,但应该有两组光源......一组用于 Tardis,一组用于 Tardis 之外。

于 2015-09-15T18:29:38.050 回答