SCNGeometrySourceを扱いやすくするextensionを書いた

SCNGeometryの頂点や法線をいじろうとすると、SCNGeometrySourceにアクセスしないといけない。

が、そのSCNGeometrySource、具体的な頂点や法線のデータは

open var data: Data { get }

このData型のプロパティに入っているだけで、頂点座標を配列で取り出せるような便利なメソッドは用意されてない

こういう情報を頼りに自分で切り出してこないといけない。

/*! 
 @property componentsPerVector
 @abstract The number of scalar components in each vector.
 */
open var componentsPerVector: Int { get }

/*! 
 @property bytesPerComponent
 @abstract The size of a vector component in bytes.
 */
open var bytesPerComponent: Int { get }

/*! 
 @property dataOffset
 @abstract The offset from the beginning of the data. In bytes.
 */
open var dataOffset: Int { get }

/*! 
 @property dataStride
 @abstract The number of bytes from a vector to the next one in the data.
 */
open var dataStride: Int { get }

というわけで簡単に取り出せるextensionを書いた。

SCNGeometryにこういうメソッドを生やして、

func sourceVectors(for semantic: SCNGeometrySource.Semantic) -> [float3]

こんな感じで当該ジオメトリが持つ頂点の座標を配列で取得できる。

 let vertices = geometry.sourceVectors(for: .vertex)

ちなみにAPI的には各Semanticに汎用的に対応できるような感じで書いてるけど、今のところ.vertexでしか動作確認はしてない。が、同じくfloat3型の.normalもいけるはず。geometry sourceの要素の型が違うSemanticには今のところ使えない。

以下extensionのソースコード。特殊なことは何もしてないが、何分かの時間節約にはなるのでは。。

ここから先は

1,079字

¥ 100

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/