SceneKit NSNode 拆分部分
Posted
技术标签:
【中文标题】SceneKit NSNode 拆分部分【英文标题】:SceneKit NSNode split parts 【发布时间】:2017-05-07 02:25:25 【问题描述】:我的 SceneKit 项目使用了一个导入的 .OBJ 文件,该文件仅包含一个带有巨大图像的节点。图像包含不同的对象或部分。我需要点击一只脚或图像的特定部分,并将其突出显示。 这是导入 .obj 文件的代码
sceneView = SCNView(frame: self.view.frame)
self.view.addSubview(sceneView)
let scene = SCNScene(named: "OBJ.obj")!
print("\(scene.rootNode.childNodes.first?.geometry?.materials.count)")
sceneView.scene = scene
这里我使用的是点击手势识别器
// add a tap gesture recognizer
let doubleTapRecognizer = UITapGestureRecognizer(target: self, action : #selector(self.tapGesture(sender:)));
doubleTapRecognizer.numberOfTapsRequired = 1;
doubleTapRecognizer.numberOfTouchesRequired = 1;
sceneView.addGestureRecognizer(doubleTapRecognizer);
func tapGesture(sender: UITapGestureRecognizer)
let hitResult : SCNHitTestResult
// check what nodes are tapped
let p = sender.location(in: sceneView)
let hitResults = sceneView.hitTest(p, options: nil)
我有 3D 模型,其中需要轻敲左脚右脚和地板等不同部位并在它们上显示不同的颜色。问题是所有这些都在单个节点中。
【问题讨论】:
你确定它只是一个节点并且它没有任何子节点吗?多个节点通常有 1 个图像。再次检查您的节点层次结构。否则,正如 Hal Mueller 所说,回到 3D 建模软件并将一个网格拆分为多个网格是明智的。 是的,我确定只有一个节点。节点由我使用 HitTest 方法获得的许多几何元素组成。最后我得到了 3d 模型的每个部分。现在我面临的问题是如何将材质应用于漫射几何元素颜色? 查看SCNGeometryElement
developer.apple.com/reference/scenekit/scngeometryelement 的文档。您的几何图形由多个元素组成,这些元素可以对应于多种材料。
【参考方案1】:
您的SCNHitTestResult
将为您提供被点击的三角形的索引。但是您仍然需要弄清楚从单个三角形到识别“那是左臂”的逻辑。
我认为你最好的选择是回到你的 3D 建模软件并将对象分解成更小的逻辑组件。
【讨论】:
我完成了第一项任务,通过如何对 HITTEST Array 返回的 ElementIndex 的颜色进行着色或扩散来识别对象? 实际上,你不能。从理论上讲,当然可以,但这需要您深入了解建模工具如何将材料分配给三角形,以及如何分配元素索引。我敢肯定有人知道如何做到这一点,但最好的办法是使用 Blender 或 Maya 或 3ds Max 或 Cheetah3D 将您的 .OBJ 分解为更小的组件。 先生,实际上我通过 HitTest 方法获得了一个数组,其中包含许多 SCHHITTESTRESULT 对象,我采用了第一个对象并使用了属性 geometryIndex,它返回了 3D 模型的所有部分,范围从 1 到 36。现在头痛的是如何在该 geometryIndex 部分应用不同的颜色? 这是您的下一个问题。如何将任意材料分配给仅知道几何索引的基于 DAE 的模型的不同三角形?以上是关于SceneKit NSNode 拆分部分的主要内容,如果未能解决你的问题,请参考以下文章