1

尝试创建我自己的自定义SCNGeometry子类,类似于框架的SCNBox, SCNPyramid,SCNCapsule等。我已经建立了我的源数组和元素数组,但是下面是一个方便的初始化器,而不是指定的初始化器!

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

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

尝试失败

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

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

真的很遗憾,Apple 实际上并没有向您展示此类事情的来源,也没有关于它的良好文档。我的意思是他们标记SCNGeometryopen,但是没有给你任何关于如何实际使用它的信息,而且很多 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 }
}

解决方法

我已经完成了所有信息以成功构建我的源和元素(同样,我试图传递给我的上面的类),并确认它可以正常工作并使用便捷初始化程序正确呈现,然后是材料属性,所以从技术上讲,我可以将所有这些包装在一个静态工厂函数中并完成它,但我真的想在这里遵循 Apple 的 API,您可以通过初始化程序实例化几何,而不是工厂函数,所以我不想让这个去。成功完成从第 2 步到第 n 步的所有步骤真的很糟糕,只是在第一步完全跳闸……初始化!

那么,什么是指定的初始化器SCNGeometry,让我可以指定我自己的顶点和材质等,如果没有,如何在使用时指定该信息super.init()

4

1 回答 1

1

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

于 2020-06-27T04:29:59.987 回答