首先,我只想向你们介绍我的问题,因为它非常复杂,所以你需要这个才能正确理解它。
我正在尝试使用Scene Kit和Swift做一些事情:我想重现我们在电视节目 Doctor Who 中可以看到的内容,其中Doctor的宇宙飞船在内部更大,你可以看到{{3 }}。
当然,Scene Kit Framework不支持那些不真实的维度,所以我们需要做一些hackery来实现它。
现在让我们用简单的英语谈谈我的想法
事实上,我们想要做的是在同一个地方展示两个完全不同的尺寸;所以我想:
现在,让我们说你在船外,你将在外部维度,在这个外部维度,我的目标是显示内部维度的一部分在相机在外面但在我们可以清楚地看到内部更大的地方给出这种效果的门的水平:
我们会从内部使用等效原则。
现在让我们来谈谈游戏逻辑:
我认为表示这些维度的好方法是两个使用两个场景。
我们会在外面调用outsideScene场景,并在里面调用内部场景。
因此,如果我们再次拍摄照片,这将在场景级别给出:
为了让它看起来更逼真,内部视图需要跟随外部摄像头的移动,这就是为什么我认为这两个摄像头的所有属性都是相同的:
左边是outsideScene,右边是insideScene。我用橙色代表相机视野。
如果outsideScene相机向右移动,则insideScene相机将做同样的事情,如果outsideScene相机旋转,insideScene相机将以相同的方式旋转...你得到原理。
所以,我的问题如下:我可以使用什么来掩盖某个场景的某个部分(在本例中为outsideView中的黄色区域)与另一个视图的相机(insideView)看到“?
首先,我认为我可以简单地从insideScene获取一个NSImage,然后将其作为外部场景中的表面纹理,但问题是Scene Kit会计算它的透视,光照等......所以它只会看起来我们在屏幕上显示的东西,这不是我想要的。
答案 0 :(得分:1)
在SceneKit中没有超级简单的方法来实现这一点。
如果您的“内部场景”是静态的并且可以烘焙到立方体贴图纹理中,您可以使用着色器修改器和一种称为内部贴图的技术(您可以在Web上轻松找到示例)。
如果你需要一个实时的,交互式的“内部场景”,你可以使用理智的技术,但必须先在纹理中渲染你的场景(或者用模板一个接一个地渲染你的内部场景和外部场景)。这可以通过利用SCNTechnique
(Yosemite和iOS 8中的新功能)来完成。在旧版本中,您必须在SCNSceneRenderer
委托方法中编写一些OpenGL代码。
答案 1 :(得分:0)
我不知道这是否“困难”。正如我们在iOS中所做的那样,很多时候最简单的答案是最简单的答案。
也许考虑一下:
将纹理映射到由Tardis立方体形状的几何图形规定的圆柱扇区上。确保圆柱半径等于摄像机的焦点。确保将相机跟踪到焦点。
纹理会变形,因为它是制作在立方体上的圆柱体。 Tardis中的演员节点会对相机作出适当反应,但应该有两组光源......一套用于Tardis,一套用于Tardis。