您如何使用自己的源和元素正确地子类化 SCNGeometry?

How do you properly subclass SCNGeometry with your own sources and elements?

尝试创建我自己的自定义 SCNGeometry subclass 类似于框架具有 SCNBoxSCNPyramidSCNCapsule 等的方式。我'我已经建立了我的源数组和元素数组,但下面是一个方便的初始化程序,而不是指定的!

public convenience init(
    sources. : [SCNGeometrySource],
    elements : [SCNGeometryElement]?)

我知道的唯一一个是 super.init(),但如果您使用它,源和元素是只读的。

尝试失败

我试图简单地调用 super.init(),然后用我自己的数组覆盖 sourceselements 属性,但无济于事。

注意:这两个数组与我在 SCNGeometry 上直接传递给上面 的便捷初始化程序完全相同,同时设置了材质,这很好用,所以我知道数组都是正确的。然而,这不起作用,所以在那个便利初始化程序中显然发生了其他事情,但我看不到什么。

Apple 并没有真正向您展示此类内容的来源,也没有很好的文档,这真是一种耻辱。我的意思是他们将 SCNGeometry 标记为 open,但不向您提供任何有关如何实际使用它的信息,而且 API 文档中的大部分都是完全空白的!

class TestGeometry : SCNGeometry {

    override init(
        sources   : [SCNGeometrySource],
        elements  : [SCNGeometryElement],
        materials : [SCNMaterials]){

        self.mySources  = sources
        self.myElements = elements

        super.init()

        self.materials = materials
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private let mySources  : [SCNGeometrySource]
    private let myElements : [SCNGeometryElement]

    override var sources  : [SCNGeometrySource]  { mySources }
    override var elements : [SCNGeometryElement] { myElements }
}

解决方法

我已经完成了所有信息以成功构建我的源和元素(同样,我试图传递到上面 class 中的相同信息),并已确认它可以正常工作并使用便利初始值设定项,然后是材料 属性,所以从技术上讲,我可以将所有这些都包装在一个静态工厂函数中并完成它,但我真的想按照 Apple 的 API 在这里实例化一个几何体一个初始化器,而不是一个工厂函数,所以我不想就这样放手。成功完成第 2 步到 'n' 的所有步骤真的很糟糕,只是在第一步完全失败......初始化!

那么,SCNGeometry 的指定初始化程序是什么,它允许我指定我自己的顶点和材质等,如果没有,那么在使用 [= 时如何指定该信息16=]?

好吧...感谢今年在 DubDub 的实验室,Apple 的工程师说这是不可能的。您必须使用便利初始化程序,如果您愿意,可以通过工厂方法使用它。耻辱。