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オブジェクトの作り方だけが下のように変わる。
(2)SCNGeometrySourceオブジェクトを作成するのに頂点データ列を渡すのにNSData型にする必要があるので作成する。
(3)でdataStrideをfloat値4個分としているので4個ごとに取得してくれる。
実行結果がこちら↓
↑この続き。
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個ごとに取得してくれる。
実行結果がこちら↓
↑頂点が正しく表示された。さっきのARKitで顔の頂点を表示するの、妙に頂点数少ないなと思って調べてたら間違ってた。こちらが正解。 pic.twitter.com/L8Ru0Nkl73
— Tatsuya (@yt) 2018年12月25日
スポンサーサイト