您如何使用自己的源和元素正确地子类化 SCNGeometry?
How do you properly subclass SCNGeometry with your own sources and elements?
尝试创建我自己的自定义 SCNGeometry
subclass 类似于框架具有 SCNBox
、SCNPyramid
、SCNCapsule
等的方式。我'我已经建立了我的源数组和元素数组,但下面是一个方便的初始化程序,而不是指定的!
public convenience init(
sources. : [SCNGeometrySource],
elements : [SCNGeometryElement]?)
我知道的唯一一个是 super.init()
,但如果您使用它,源和元素是只读的。
尝试失败
我试图简单地调用 super.init()
,然后用我自己的数组覆盖 sources
和 elements
属性,但无济于事。
注意:这两个数组与我在 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 的工程师说这是不可能的。您必须使用便利初始化程序,如果您愿意,可以通过工厂方法使用它。耻辱。
尝试创建我自己的自定义 SCNGeometry
subclass 类似于框架具有 SCNBox
、SCNPyramid
、SCNCapsule
等的方式。我'我已经建立了我的源数组和元素数组,但下面是一个方便的初始化程序,而不是指定的!
public convenience init(
sources. : [SCNGeometrySource],
elements : [SCNGeometryElement]?)
我知道的唯一一个是 super.init()
,但如果您使用它,源和元素是只读的。
尝试失败
我试图简单地调用 super.init()
,然后用我自己的数组覆盖 sources
和 elements
属性,但无济于事。
注意:这两个数组与我在 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 的工程师说这是不可能的。您必须使用便利初始化程序,如果您愿意,可以通过工厂方法使用它。耻辱。