SceneKit节点的交集



我在SceneKit中计算2个节点的交集有一个问题。物体像球体和更厚的平面(更复杂的多边形)。设置:简单的场景,有2个不规则的物体可以移动。我已经尝试了一些东西,比如:

  • 物理体的交集(显示与ShapeType.convexNull的某些东西,但即使物体不接触也有连接点)。ShapeType.concavePolyhedron没有显示任何东西
  • 命中测试:我有一个想法,以某种方式计算随机向量(很多),将通过两个对象并检查常见的命中值。它不工作-显示无效的点。这可能与物体移动和缩放的事实有关,但这里也没有运气。

示例代码:

let root = SCNScene()
let n1 = SCNNode()
let n2 = SCNNode()

root.rootNode.addChildNode(n1)
root.rootNode.addChildNode(n2)

// try1
let options = [SCNPhysicsShape.Option.type: SCNPhysicsShape.ShapeType.convexHull]
n1.physicsBody = SCNPhysicsBody(type: .kinematic, shape: SCNPhysicsShape(node: n1, options: options))
n2.physicsBody = SCNPhysicsBody(type: .kinematic, shape: SCNPhysicsShape(node: n2, options: options))
n1.physicsBody?.isAffectedByGravity = false
n2.physicsBody?.isAffectedByGravity = false

let opt: [SCNPhysicsWorld.TestOption : Any] = [.searchMode: SCNHitTestSearchMode.all]
let inter = root.physicsWorld.contactTestBetween(n1.physicsBody!, n2.physicsBody!, options: opt)

//does not work as expected


// trial 2

let v1 = SCNVector3(0, 0, 0)
let v2 = SCNVector3(0, 0, 50)
let n1v1 = root.rootNode.convertVector(v1, to: n1)
let n1v2 = root.rootNode.convertVector(v2, to: n1)
let n2v1 = root.rootNode.convertVector(v1, to: n2)
let n2v2 = root.rootNode.convertVector(v2, to: n2)

let n1Hit = n1.hitTestWithSegment(
from: n1v1,
to: n1v2,
options: nil)
let n2Hit = n2.hitTestWithSegment(
from: n2v1,
to: n2v2,
options: nil)

任何想法如何找到相交线/平面/点?

我会留给下一代的。我发现了一个很好的框架,可以帮助计算网格相交:https://github.com/nicklockwood/Euclid

它符合我的需要,所以这个问题就结束了。

最新更新