SceneKit 节点的交集
Posted
技术标签:
【中文标题】SceneKit 节点的交集【英文标题】:SceneKit intersection of nodes 【发布时间】:2021-05-19 09:45:18 【问题描述】:我在 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)
任何想法如何找到相交线/平面/点?
【问题讨论】:
【参考方案1】:我会把它留给下一代 :) 我找到了一个很好的框架来帮助计算网格的交集:https://github.com/nicklockwood/Euclid
它符合我的需要,所以问题已结束。
【讨论】:
以上是关于SceneKit 节点的交集的主要内容,如果未能解决你的问题,请参考以下文章
在 viewDidLoad 期间应用的 SceneKit 节点旋转无效
Scenekit - 将子节点(平面节点)添加到相机前面的父节点(球体节点)