頭と尻尾はくれてやる!

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


SceneKitで直線を描く

SceneKitにはSCNGeometryのサブクラスに
SCNPlane, SCNBox, SCNSphere, SCNPyramid, SCNCone, SCNCylinder, SCNCapsule, SCNTube, and SCNTorus(※1)
などがあってこれらを使えば簡単に平面や直方体などを作ることができる。

ところが、なぜか点と線がない。

主にデバッグ用に点や線を描きたくなる時があるので、使いやすいようにSCNNodeを返すようなクラスメソッドを作成した。

まずは直線から。なお太さは指定できない。
+(SCNNode *)makeLineNodeForSCNVectors:(SCNVector3 *)positions
{
    int indicies[] = {0,1};
    NSData *indexData = [NSData dataWithBytes:indicies length:sizeof(indicies)];
    
    SCNGeometrySource *vertexSource = [SCNGeometrySource geometrySourceWithVertices:positions count:2];
    SCNGeometryElement *element = [SCNGeometryElement geometryElementWithData:indexData primitiveType:SCNGeometryPrimitiveTypeLine primitiveCount:2 bytesPerIndex:sizeof(int)];
    SCNGeometry *line = [SCNGeometry geometryWithSources:@[vertexSource] elements:@[element]];
    
    SCNNode *lineNode = [SCNNode nodeWithGeometry:line];

    return lineNode;
}

{
    //呼び出す側
    SCNVector3 positions[] = {  SCNVector3Make(-3.0 , 3.0 , 0.0) , SCNVector3Make(3.0 , 3.0 , 0.0) };
    SCNNode *lineNode = [MyUtility makeLineNodeForSCNVectors:positions];
    lineNode.geometry.firstMaterial.diffuse.contents = [UIColor whiteColor];
}
↑2点を与えそれらを結ぶ直線を描く。
SCNGeometryPrimitiveTypeLineで2点だとどういう形状か確定するためか、indexDataがnilでも動く。そういうものなのか。

あと、座標を表すのにSCNVectorを使っているけどSCNVectorは
typedef struct SCNVector3 {
    float x, y, z;
} SCNVector3;
というように3つのfloat値を持つ構造体として定義されてるので、
{
    float *positions = calloc(6, sizeof(float));
    positions[0]  = -3.0;
    positions[1]  = 3.0;
    positions[2]  = 0.0;
    positions[3]  = 3.0;
    positions[4]  = 3.0;
    positions[5]  = 0.0;
}
↑このようにfloat値を並べて置いてそのポインタを渡してもOK(ただしキャストしないと警告が出る)。

直線描画のスクリーンショット

↑実行結果、、、あれ?スクショをトリミングして縮小したら線が見えなくなった?

↑動画をTwitterにアップしてみた。かろうじて見えるかも。


※1 公式リファレンスはこちら↓
SCNGeometry - SceneKit | Apple Developer Documentation


スポンサーサイト

<< SceneKitで点を描く  TopPage  フロントカメラが得た画像を自分の顔のテクスチャ用にシェーダに渡したい(3) >>

コメント


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

トラックバック

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




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

FC2Ad