【发布时间】:2018-01-14 05:38:20
【问题描述】:
在场景中,两个 3d 对象没有相互接触,而是调用了函数func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {}。
我使用addItem()在场景中添加节点
func addItem(hitTestResult: ARHitTestResult) {
if let selectedItem = self.selectedItem {
let scene = SCNScene(named: "art.scnassets/\(selectedItem).scn")
let node = (scene?.rootNode.childNode(withName: selectedItem, recursively: false))!
let transform = hitTestResult.worldTransform
let thirdColumn = transform.columns.3
node.position = SCNVector3(thirdColumn.x, thirdColumn.y, thirdColumn.z)
node.physicsBody = SCNPhysicsBody(type:.dynamic, shape: SCNPhysicsShape(node: node, options: nil))
node.physicsBody?.isAffectedByGravity = false
node.physicsBody?.categoryBitMask = BitMaskCategory(rawValue: selectedItem)!.maskValue
node.physicsBody?.contactTestBitMask = BitMaskCategory.mug.maskValue
self.sceneView.scene.rootNode.addChildNode(node)
}
}
enum BitMaskCategory: String {
case mug, banana, cup, vase
var maskValue : Int {
switch self {
case .mug: return 1
case .banana: return 2
case .cup: return 3
case .vase: return 4
}
}
}
当我点击屏幕并在场景中添加两个节点(杯子和马克杯)时,这两个节点开始相互远离。他们互相排斥,即使他们没有互相接触。
谢谢。
【问题讨论】:
-
要调试碰撞或接触,您需要使用调试功能。 sceneView.debugOptions = .showPhysicsShapes 这将显示物理形状是否大于可见的渲染节点。这通常发生在您在导入 dae 后让 SceneKit 近似形状时。
标签: objective-c 3d arkit