在 SceneKit 中声明的 func hitTest 导致 Playground 崩溃
func hitTest declared in SceneKit causes crash in Playground
我在操场上创建了一个场景并使用 hitTest (func hitTest(_ point: CGPoint, options: [SCNHitTestOption : Any]? = nil) -> [SCNHitTestResult]) 函数来确定其中一个节点是否已经被触摸,但仅当触摸节点时才会导致操场上的模拟器崩溃。 iOS 项目中与 xcode.
相同的代码不会发生这种情况
func panGesture(sender: UIPanGestureRecognizer) {
sender.view
let translation = sender.translation(in: sender.view!)
var newAngleX = (Float)(translation.y)*(Float)(M_PI)/180.0
newAngleX += currentXAngle
var newAngleY = (Float)(translation.x)*(Float)(M_PI)/180.0
newAngleY += currentYAngle
if (sender.numberOfTouches>0){
var point = sender.location(in: self)
print(point)
let hit = self.hitTest(point, options: nil)
let node = hit.first?.node
node?.eulerAngles.x = newAngleX
node?.eulerAngles.y = newAngleY
if(sender.state == UIGestureRecognizerState.ended) {
currentXAngle = newAngleX
currentYAngle = newAngleY
}
}
}
这 运行 在 Playground 中真的、真的、真的很慢...但也许还有其他事情正在发生。无论如何,如果你用这个替换你的 func panGesture(sender: UIPanGestureRecognizer)
,它至少应该让你 运行 它在 Playground 中不会崩溃。
func panGesture(sender: UIPanGestureRecognizer) {
sender.view
let translation = sender.translation(in: sender.view!)
var newAngleX = (Float)(translation.y)*(Float)(M_PI)/180.0
newAngleX += currentXAngle
var newAngleY = (Float)(translation.x)*(Float)(M_PI)/180.0
newAngleY += currentYAngle
let point = sender.location(in: self)
print(point)
// important
guard let hit = self.hitTest(point, options: nil) as? [SCNHitTestResult] else { return }
// and, don't go in here if hit.count == 0, because it won't have a .first
if (sender.numberOfTouches > 0 && hit.count > 0){
let node = hit.first?.node
node?.eulerAngles.x = newAngleX
node?.eulerAngles.y = newAngleY
if(sender.state == UIGestureRecognizerState.ended) {
currentXAngle = newAngleX
currentYAngle = newAngleY
}
}
}
我在操场上创建了一个场景并使用 hitTest (func hitTest(_ point: CGPoint, options: [SCNHitTestOption : Any]? = nil) -> [SCNHitTestResult]) 函数来确定其中一个节点是否已经被触摸,但仅当触摸节点时才会导致操场上的模拟器崩溃。 iOS 项目中与 xcode.
相同的代码不会发生这种情况func panGesture(sender: UIPanGestureRecognizer) {
sender.view
let translation = sender.translation(in: sender.view!)
var newAngleX = (Float)(translation.y)*(Float)(M_PI)/180.0
newAngleX += currentXAngle
var newAngleY = (Float)(translation.x)*(Float)(M_PI)/180.0
newAngleY += currentYAngle
if (sender.numberOfTouches>0){
var point = sender.location(in: self)
print(point)
let hit = self.hitTest(point, options: nil)
let node = hit.first?.node
node?.eulerAngles.x = newAngleX
node?.eulerAngles.y = newAngleY
if(sender.state == UIGestureRecognizerState.ended) {
currentXAngle = newAngleX
currentYAngle = newAngleY
}
}
}
这 运行 在 Playground 中真的、真的、真的很慢...但也许还有其他事情正在发生。无论如何,如果你用这个替换你的 func panGesture(sender: UIPanGestureRecognizer)
,它至少应该让你 运行 它在 Playground 中不会崩溃。
func panGesture(sender: UIPanGestureRecognizer) {
sender.view
let translation = sender.translation(in: sender.view!)
var newAngleX = (Float)(translation.y)*(Float)(M_PI)/180.0
newAngleX += currentXAngle
var newAngleY = (Float)(translation.x)*(Float)(M_PI)/180.0
newAngleY += currentYAngle
let point = sender.location(in: self)
print(point)
// important
guard let hit = self.hitTest(point, options: nil) as? [SCNHitTestResult] else { return }
// and, don't go in here if hit.count == 0, because it won't have a .first
if (sender.numberOfTouches > 0 && hit.count > 0){
let node = hit.first?.node
node?.eulerAngles.x = newAngleX
node?.eulerAngles.y = newAngleY
if(sender.state == UIGestureRecognizerState.ended) {
currentXAngle = newAngleX
currentYAngle = newAngleY
}
}
}