ARKitで平面検出したいと思い参考にしたAppleのサンプルプロジェクトで、検出平面を色付きで表現する際にマテリアルのdiffuse
というプロパティに色を指定していた。
guard let material = extentNode.geometry?.firstMaterial else { fatalError("...") }
material.diffuse.contents = UIColor.planeColor
この、diffuse.contents
に色とか画像を指定すれば、なんかノードの表面にそれを描画できるらしい…
そもそもこのdiffuse
、SCNMaterialProperty
というクラスで、その名前の通り、SceneKitにおける「マテリアル」の視覚特性を表す色やテクスチャを包含するもの、らしい。
A container for the color or texture of one of a material’s visual properties.
SCNMaterialProperty
ここで「マテリアル」とは?という疑問が浮かび、さらに、この「マテリアル」を持つ「ジオメトリ」とは?「ノード」とは?「シーン」とは?…と、そもそも分からないことだらけだったので調べてみた。
SCNScene
A container for the node hierarchy and global properties that together form a displayable 3D scene.
SCNScene
3次元コンテンツを表示するためのノード階層と、グローバルな視覚属性を保有するもの。プロパティには、背景や、シーンを取り囲むライティング環境の定義があり、これらはSCNMaterialProperty
によって表される。
加えて、
- fog(霧)
- 物理シミュレーション (
SCNPhysicsWorld
) - シーンで表されるパーティクル表現 (
SCNParticleSystem
)
も定義できる。
SCNNode
A structural element of a scene graph, representing a position and transform in a 3D coordinate space, to which you can attach geometry, lights, cameras, or other displayable content.
SCNNode
シーングラフを階層により構成する要素で、3D空間における位置やtransformを表現する。「ジオメトリ」や光源、カメラなど「表示可能なコンテンツ」を ”attach” できる。
一方で、これ自体は ”visible content” 、つまりレンダーされて視覚できるコンテンツは保持しないとある。あくまでも座標系における位置、回転、スケールのみを表現するものらしい。
シーンを構成するに置いて、
- ノードの階層でその構造を組み上げ
- そこに、ノードに対して光源やカメラ、「ジオメトリ」を加えることで、visible content を作り上げる
とある。分かったような分からないような。
SCNGeometry
A three-dimensional shape (also called a model or mesh) that can be displayed in a scene, with attached materials that define its appearance.
SCNGeometry
3次元のシェイプ、モデルやメッシュと呼ばれるもので、シーン内で表示でき、さらに外観を定義する「マテリアル」を付加できるらしい。
ここで、
- Geometry: 3次元形状
- Material: 外観
ということが分かってきた。
実際、SCNGeometry
を親クラスとしてSCNPlane
(平面)やSCNSphere
(球)、SCNCylinder
(円柱)といったBasic Shapesなるクラス群が存在する。
ちなみに、ジオメトリは複数のSCNMaterialを持つmaterialsというプロパティが存在し、それはジオメトリが包含する複数のelementに対応するという。つまりドキュメントの例をとると、ティカップの胴/取手/蓋/注ぎ口をそれぞれのelementとし、この集合体をひとつのジオメトリとして定義できるようだ。
SCNMaterial
A set of shading attributes that define the appearance of a geometry’s surface when rendered.
SCNMaterial
シェーディング属性のsetで、つまりGeometry表面がレンダーされる際の外観定義である。
Visual properties にはいくつか分類があり、冒頭のdiffuse
は、分類のひとつ “Physically Based Shading” に含まれる。
diffuse
: マテリアルの光の拡散効果metalness
: マテリアル表面のメタリックさroughness
: マテリアル表面のなめらかさ
光が物体表面で反射、拡散することによって人の眼球に入射することで色を知覚することから、diffuse
で色を、metalness
やroughness
で質感を表現するものと推察した。
またこれらを含め、ほぼすべての visual property が、SCNMaterialProperty
によって表される。
Visual propertiesの分類は他にも
- Special Effects
- Basic Shading
がある。
SCNMaterialProperty
A container for the color or texture of one of a material’s visual properties.
SCNMaterialProperty
冒頭にも引用したものだが、マテリアルの視覚属性としての色やテクスチャを保持するものらしい。
この色やテクスチャは、contents: Any?
に指定するものだが、これがどのように使われるかは、どの visual property かによって異なるという。例えば冒頭のdiffuse
であればマテリアルのベース色を、specular
であれば視覚者に対する直接反射光の色を、それぞれ定義する。
他にも、テクスチャマッピングに関する属性も定義でき、S texture coordinateやT texture coordinateといった用語が並ぶが、今は気にしない。
ARKitの祖、SceneKitの基礎の基礎に近づけた気がする。