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,094文字

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

shu223

100円

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

4

shu223

フリーランスiOSエンジニア兼サンフランシスコのFyusion社勤務。 著書に「iOS×BLE Core Bluetooth プログラミング」「iOSアプリ開発 達人のレシピ100」。GitHubで「iOS Sampler」シリーズ他さまざまなオープンソースを公開している。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。