【问题标题】:How to make a plane mirror in SceneKit如何在 SceneKit 中制作平面镜
【发布时间】:2015-03-13 02:11:51
【问题描述】:

对于SCNFloor,如果reflective设置为1,并且reflectionFallOffEnd足够大,就会像一面镜子。

我的问题是如何将其应用于其他几何形状(例如平面或盒子)?因为我想在我的游戏中有一面镜子。

【问题讨论】:

    标签: ios objective-c swift scenekit


    【解决方案1】:

    我已经对如何使用 Scenekit 进行反射进行了大量研究。

    以下是我发现的不同线索(遗憾的是,它们都需要大量的代码和研究):

    屏幕空间反射

    优点:

    • 便宜
    • 制作简单

    缺点

    • 并不总是很好看
    • 我不知道如何使用 SCNTechnique 输出正常通行证

    视差映射立方体贴图

    优点:

    • 便宜
    • 看起来很棒

    缺点

    • 除非使用图像代理,否则没有实时对象
    • 网上没有好的代码示例,需要研究
    • 不太清楚如何在 SCNProgram 中使用它

    两个摄像头 + Stencil

    优点:

    • 现实
    • 实时
    • 几乎内置

    缺点

    • 没有关于 SCNTechnique 的 pointOfView 的文档
    • 没有关于 Stencils 的文档
    • 需要渲染两次场景

    OpenGL 镜像

    优点:

    • 实际上复制了几何图形,非常准确
    • 这是 SCNFloor 使用的技术(我认为)

    缺点

    • 几何图形可以与镜像平面夹在一起(发生在 SCNFloor 上)
    • 不能在飞机以外的任何地方使用
    • 需要 OpenGL 代码

    4 个相机链接到一个立方体贴图

    优点:

    • 易于设置
    • 实时
    • 适用于任何对象
    • 现代电子游戏中非常流行的技术

    缺点

    • 我不知道这是否可行
    • 需要为单个镜子渲染场景 5 次
    • 不是很准确,具体取决于对象

    我的结论是,我们在使用 SCNTechnique 方面需要更多帮助。我们可以用它构建出令人惊叹的东西,但缺乏文档和示例是一个大问题。

    如果您能具体说明您心目中的镜子类型,我很乐意帮助您选择最佳方式。

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题,但我想分享我所做的。我在 GitHub 上创建了一个 gist,其中包含代码并解释了它是如何工作的。

      它基本上将六个摄像机附加到一个节点并自动创建一个立方体贴图,然后将其用作对象的反射属性。主要缺点是它不适用于基于物理的材质,但为了模拟粗糙度,它会将立方体贴图模糊为您将粗糙度属性设置为的任何值。它实时运行良好,您可以设置立方体贴图的更新速度,这样您就不会过多地影响游戏的帧速率。它还可以处理许多不同的反射对象,并自动停止更新您看不到的节点。

      【讨论】:

      • 感谢 @moustach 提出将相机链接到立方体贴图的想法
      【解决方案3】:

      目前其他几何类型不支持此功能。请file a request to Apple

      【讨论】:

        猜你喜欢
        • 2014-08-04
        • 2017-12-16
        • 2018-06-05
        • 2017-12-30
        • 2021-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        相关资源
        最近更新 更多