頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


4要素のうちの3要素で頂点座標データ(SCNGeometrySourceオブジェクト)を作る

sizeof(simd_float3)=16という罠
↑この続き。
ARFaceGeometryクラスのverticesプロパティでsimd_float3型の頂点データ列を入手できるが、この型はfloat値を4つ持つ。
このデータ列を使ってなんとか頂点データを作成し、点を描きたい。

(x0 , y0 , z0 , 0.)
(x1 , y1 , z1 , 0.)
(x2 , y2 , z2 , 0.)

↑このようにfloat値が並んでいるsimd_float3から4要素目を無視して頂点データ列を作る必要がある。
自分で頂点数分のループを回してデータを作成、、、なんてことをしなくてもありがたいことに使えるメソッドがある。
これを使い、SceneKitで点を描くクラスメソッドを作成した。

SceneKitで点を描く

↑元はこちらにあるコードで、SCNGeometrySourceオブジェクトの作り方だけが下のように変わる。
+(SCNNode *)makeDotsNodeFor_simd_float3:(simd_float3 *)positions nofDots:(NSUInteger)nofDots dotRadius:(float)dotRadius
{
    //SCNGeometrySource *vertexSource = [SCNGeometrySource geometrySourceWithVertices:(const SCNVector3 *)positions count:nofDots];// —(1)

    NSData *data = [NSData dataWithBytes:positions length:sizeof(float)*4*nofDots];// —(2)
    
    SCNGeometrySource *vertexSource = [SCNGeometrySource
                                       geometrySourceWithData:data
                                       semantic:SCNGeometrySourceSemanticVertex
                                       vectorCount:nofDots
                                       floatComponents:YES
                                       componentsPerVector:3
                                       bytesPerComponent:sizeof(float)
                                       dataOffset:0
                                       dataStride:sizeof(float)*4];// —(3)
    …
}

{
    // 呼び出し元
    …
    const simd_float3 *vertices = arFaceGeometry.vertices;
    SCNNode *dotsNode = [MyUtility makeDotsNodeFor_simd_float3:(simd_float3 *)vertices nofDots:arFaceGeometry.vertexCount dotRadius:15.0];
    …
}
(1)は修正前のコード。SCNVector3が並んでいるデータならこれでOK。
(2)SCNGeometrySourceオブジェクトを作成するのに頂点データ列を渡すのにNSData型にする必要があるので作成する。
(3)でdataStrideをfloat値4個分としているので4個ごとに取得してくれる。

実行結果がこちら↓
↑頂点が正しく表示された。


スポンサーサイト

<< Amazonのほしい物リストで漫画「弱虫ペダル」47巻が届いた!  TopPage  sizeof(simd_float3)=16という罠 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1274-f0df5668




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad