SceneKit関連のスニペットや、単体の記事にするほどでもないメモをここに随時書き足していく予定です。
3次元計算
ランダムな3次元単位ベクトルを生成
Swift
func randomVector3() -> SCNVector3 {
let rand = SCNVector3(random(min: -1.0, max: 1.0),
random(min: -1.0, max: 1.0),
random(min: -1.0, max: 1.0))
return rand.normalized
}
いろんなアプローチがあるみたいだが、下記記事を読んだ感じだととりあえずこのシンプルなのでもよさそう。
複数軸方向に回転
swift
let rotX = SCNMatrix4MakeRotation(Float.pi, 1, 0, 0)
let rotZ = SCNMatrix4MakeRotation(Float.pi/2, 0, 0, 1)
node.pivot = SCNMatrix4Mult(rotZ, rotX)
objc
SCNMatrix4 rotX = SCNMatrix4MakeRotation(M_PI, 1, 0, 0);
SCNMatrix4 rotZ = SCNMatrix4MakeRotation(M_PI/2, 0, 0, 1);
node.pivot = SCNMatrix4Mult(rotZ, rotX);
回転行列の積をSCNMatrix4Mult
で計算する。
pivotはオブジェクトを回転、スケールする際に基準となる点のこと。型はSCNMatrix4
。上記の例ではx軸まわりに180°、z軸まわりに90°の回転をpivotとして与えている。
ヒットテスト
サーチモード
SCNHitTestOptionSearchMode
(SwiftではSCNHitTestOption.searchMode
)のデフォルトはSCNHitTestSearchModeClosest
(Swiftでは.closest
)なので一番近いのしか返してくれない。(ドキュメントには書いてないが、実際に値をみてそうなっていた)
- https://forums.developer.apple.com/thread/83700
- https://developer.apple.com/documentation/scenekit/scnhittestoption/2866222-searchmode
全結果を取得にはSCNHitTestSearchModeAll
(.all)を指定する。
objc
NSDictionary<SCNHitTestOption, id> *options = @{SCNHitTestOptionSearchMode: @(SCNHitTestSearchModeAll)};
NSArray<SCNHitTestResult *> *results = [self.renderer hitTest:pos options:options];