SceneKit

SceneKitのアニメーション(SCNAction)でカスタムのEasing Functionを使う

SCNActionのtimingModeプロパティにはSCNActionTimingMode型でイージング関数を指定できるが、

case linearcase easeIncase easeOutcase easeInEaseOut

これだけしか定義されていない。

じゃあこういうカーブを適用したい場合は諦めるしかないのかというと、

timingFunctionプロパティがある。

SCNA

もっとみる

SceneKitのパーティクルを個々にフェードアウトさせる

SpriteKitのパーティクルにはアルファの加速度を設定できるプロパティがあり、そこにマイナス値を設定すればアルファでフェードアウトすることになる。(しかし、減速しつつアルファ値はフェードインして、速度が0になったところからフェードアウト、みたいな制御はできない)

で、SceneKitのパーティクルSCNParticleSystem を使う場合には、そういうプロパティが見当たらない。パーティク

もっとみる

SceneKitのパーティクルをMetalでカスタムレンダリングする

SCNParticleSystemでつくったパーティクルを扱う一般的な手法としては、SCNViewを使い、sceneプロパティに渡すSCNSceneオブジェクトのrootNodeにaddParticleSystemするか、addParticleSystemしたSCNNodeオブジェクトをrootNodeにaddChildNodeする。で、SceneKitは内部でMetalを使っているので、これだけ

もっとみる

ARKitオクルージョンの常套手段:SCNNodeのrenderingOrderとSCNMaterialのcolorBufferWriteMaskとwritesToDepthBufferについて

ARKitでオクルージョンを実現するのに、

geometry.firstMaterial!.colorBufferWriteMask = []occlusionNode = SCNNode(geometry: geometry)occlusionNode.renderingOrder = -1

とするテクニックがある。Appleのフェイストラッキングのサンプルで使われている。(仮想のメガネが、

もっとみる

SceneKitのライティングモデルのドキュメントを改めて読む

なんとなく使ってるところをちゃんと確認したい。まずこのSCNMaterial.LightingModel。ARKitだったら.physicallyBasedかな、ぐらいのなんとなくさで指定している。デフォルト値も把握してない。マテリアルの他のプロパティやシーン内のライトとの相互作用も把握してない。

このページにこういう図があった。

パッと見て「注目すべきポイント」がよくわからない。Physic

もっとみる

SCNGeometrySourceを扱いやすくするextensionを書いた

SCNGeometryの頂点や法線をいじろうとすると、SCNGeometrySourceにアクセスしないといけない。

が、そのSCNGeometrySource、具体的な頂点や法線のデータは

open var data: Data { get }

このData型のプロパティに入っているだけで、頂点座標を配列で取り出せるような便利なメソッドは用意されてない。

こういう情報を頼りに自分で切り出

もっとみる

ARKitの 「点」に対するヒットテストについておさらいする

特徴点に対するヒットテスト

ARKitでのヒットテストといえば、まずARSCNViewのhitTestメソッドがある。

func hitTest(_ point: CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]

で、この第2引数に渡すARHitTestResult.ResultType型のバリエーションとしてf

もっとみる