私たちのシーンには約 20 個のノードしかありません。以下のコードにより、ユーザーはパンを実行し、各パンでヒット テストを実行できます。目標は、ユーザーが画面をパンするときにブロックを強調表示することです。
ただし、iPhone 5S では著しく遅くなります。それは決定論的ではありませんが、イライラするほど頻繁に発生します(5〜10回のパンごと)。
テストの範囲を厳密に制限できるため、使用を検討しhitTestWithSegment
ましたが、関数に必要な 2 つのポイントを最初に計算する必要があるため、遅くなるはずです。
さらに、 のSCNHitTestClipToZRangeKey
オプションはhitTest
、2 つの追加ポイントの計算を必要とせずにヒット範囲を狭めることによって、同等のパフォーマンスの向上を提供する必要があります。
のパフォーマンスを高速化するための提案はありhitTest
ますか?
func sceneViewPannedOneFinger(sender: UIPanGestureRecognizer) {
// Get pan distance & convert to radians
let translation = sender.translationInView(sender.view!)
var xRadians = GLKMathDegreesToRadians(Float(translation.x))
var yRadians = GLKMathDegreesToRadians(Float(translation.y))
// Get x & y radians
xRadians = (xRadians / 4) + curXRadians
yRadians = (yRadians / 4) + curYRadians
// Limit yRadians to prevent rotating 360 degrees vertically
yRadians = max(Float(-M_PI_2), min(Float(M_PI_2), yRadians))
// Set rotation values to avoid Gimbal Lock
cameraNode.rotation = SCNVector4(x: 1, y: 0, z: 0, w: yRadians)
userNode.rotation = SCNVector4(x: 0, y: 1, z: 0, w: xRadians)
// Save value for next rotation
if sender.state == UIGestureRecognizerState.Ended {
curXRadians = xRadians
curYRadians = yRadians
}
// Set preview block
setPreviewBlock(sender)
}
private func setPreviewBlock(recognizer: UIGestureRecognizer) {
let point = recognizer.locationInView(sceneView)
let options = [SCNHitTestRootNodeKey: sceneView.scene!.rootNode, SCNHitTestClipToZRangeKey: 15, SCNHitTestSortResultsKey: true]
let hits = sceneView.hitTest(point, options: options)
print(hits.first?.worldCoordinates)
}