FC2ブログ

頭と尻尾はくれてやる!

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


sizeof(simd_float3)=16という罠

ARKitのARFaceGeometryから顔の頂点を描く
↑この続き。
なんか頂点の表示がおかしいのでは?と調べていたら

sizeof(simd_float3)の出力結果

↑sizeof(simd_float3)が16ということに気付いた、、、!!!

16バイト?!

float値は32bitで4バイト。それが4つ分?3つじゃないだと?

どうやらsimd_float3はfloat値が3つではなく4つ分のサイズらしい。

simd_float3のヘッダー

↑リファレンスにはそんなこと書いていないけど、ヘッダーにはそう書いてる(時々あるよね)。

簡単な確認をする。
{
    simd_float3 vertices[] = {
        simd_make_float3(1.0 , 2.0 , 3.0) ,
        simd_make_float3(4.0 , 5.0 , 6.0) ,
        simd_make_float3(7.0 , 8.0 , 9.0) ,
        simd_make_float3(10.0 , 11.0 , 12.0)
    }; // —(1)

    for (NSUInteger ite=0;ite<4;ite++) { //—(2)
        simd_float3 vertex = vertices[ite];
        NSLog(@"vertex[%ld] (%f,%f,%f)", ite , vertex.x,vertex.y,vertex.z);
    }

    
    float *fcv = (float *)vertices;// float-casted vertices —(3) 
    for (NSUInteger ite=0;ite<4;ite++) { // —(4) 
        NSLog(@"fcv%ld (%f,%f,%f)", ite , fcv[ite*3+0],fcv[ite*3+1],fcv[ite*3+2]);
    }
}
(1)simd_float3型の頂点を4個作成してverticesとする。
(2)のようにして作成したデータを確認する。
(3)floatにキャストする。
(4)キャストしたfloat値を3個ずつ表示する。

その結果がこちら↓

実行結果

↑キャストした場合、4要素目にゼロが入っているのがわかる。
この場合、4つに1つしかまともな頂点座標を示していない。
なるほど、それで前記事では頂点が正しく描画できなかったわけだ。

続く。



<< 4要素のうちの3要素で頂点座標データ(SCNGeometrySourceオブジェクト)を作る  TopPage  ARKitのARFaceGeometryから顔の頂点を描く >>

コメント


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

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1273-a84b577b




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

FC2Ad