第2章 ARKit 堤 修一/@shu223
2.9.3 頂点座標の配列から、線としてのカスタムジオメトリを構成する
ここで「カスタム」なジオメトリと呼んでいるのは、SceneKitが提供しているSCNPlane(平面)やSCNSphere(球)以外の、自分で定義する形状のSCNGeometryサブクラスのことです。
本項では各時点でのデバイス位置(ワールド座標)を頂点として蓄積していき、動的に線としてのカスタムジオメトリを構成する実装方法を示します。
たとえば頂点座標のSCNVector3とそのインデックスを蓄積していくための配列を次のように定義しておき、
private var vertices: [SCNVector3] = [] private var indices: [Int32] = []
頂点とそのインデックスを格納した後、次のようにSCNGeometrySource、SCNGeometryElementを生成します。
let source = SCNGeometrySource(vertices: vertices) let element = SCNGeometryElement(indices: indices, primitiveType: .line)
ここで、SCNGeometryElementの初期化の際に第2引数に渡しているプリミティブタイプ.lineは、第1引数に渡されたインデックスの配列が、線を構成するものであることを指定するものです。
これら2つのオブジェクトを用いて、SCNGeometryを生成できます。
let geometry = SCNGeometry(sources: [source], elements: [element])
ただし、頂点を結んで線としてのカスタムジオメトリを構成する場合、その線は「太さ」を持ちません。そこで、三角形を2つ組み合わせて太い線を構成するようにします。
図2.15 (左)2頂点で線を構成(右)三角形を2つ組み合わせて線を構成
この場合はSCNGeometryElementの初期化の際に第2引数に.triangleStripを渡します。
let element = SCNGeometryElement(indices: indices, primitiveType: .triangleStrip)