在SceneKit节点周围添加边框

8

我正在尝试使用轻点手势在SceneKit中突出显示所选节点。不幸的是,我还没有成功。我能做到的最好的事情就是在点击节点时更改材质。

let material = key.geometry!.firstMaterial!
material.emission.contents = UIColor.blackColor()

有人可以提供一种方法,让我只能在对象周围添加边框或轮廓而不改变整个节点的颜色吗?


你的意思是SKSpriteNode,对吧?不是SKNode - Luca Angeletti
1
抱歉如果有任何困惑,我正在使用Scene Kit.. SCNNode。 - user4432964
3个回答

8

根据@Karl Sigiscar的回答和SO上的另一个回答,我得出了以下结论:

func createLineNode(fromPos origin: SCNVector3, toPos destination: SCNVector3, color: UIColor) -> SCNNode {
    let line = lineFrom(vector: origin, toVector: destination)
    let lineNode = SCNNode(geometry: line)
    let planeMaterial = SCNMaterial()
    planeMaterial.diffuse.contents = color
    line.materials = [planeMaterial]

    return lineNode
}

func lineFrom(vector vector1: SCNVector3, toVector vector2: SCNVector3) -> SCNGeometry {
    let indices: [Int32] = [0, 1]

    let source = SCNGeometrySource(vertices: [vector1, vector2])
    let element = SCNGeometryElement(indices: indices, primitiveType: .line)

    return SCNGeometry(sources: [source], elements: [element])
}


func highlightNode(_ node: SCNNode) {
    let (min, max) = node.boundingBox
    let zCoord = node.position.z
    let topLeft = SCNVector3Make(min.x, max.y, zCoord)
    let bottomLeft = SCNVector3Make(min.x, min.y, zCoord)
    let topRight = SCNVector3Make(max.x, max.y, zCoord)
    let bottomRight = SCNVector3Make(max.x, min.y, zCoord)


    let bottomSide = createLineNode(fromPos: bottomLeft, toPos: bottomRight, color: .yellow)
    let leftSide = createLineNode(fromPos: bottomLeft, toPos: topLeft, color: .yellow)
    let rightSide = createLineNode(fromPos: bottomRight, toPos: topRight, color: .yellow)
    let topSide = createLineNode(fromPos: topLeft, toPos: topRight, color: .yellow)

    [bottomSide, leftSide, rightSide, topSide].forEach {
        $0.name = kHighlightingNode // Whatever name you want so you can unhighlight later if needed
        node.addChildNode($0)
    }
}

func unhighlightNode(_ node: SCNNode) {
    let highlightningNodes = node.childNodes { (child, stop) -> Bool in
        child.name == kHighlightingNode
    }
    highlightningNodes.forEach {
        $0.removeFromParentNode()
    }
}

1
线条太细了,能否让线条看起来更粗一些? - aznelite89
已经实现了这个功能,但是没有任何线条可见……节点已经添加了,但是不可见…… - Tycho Pandelaar

3

SCNNode符合SCNBoundingVolume协议。

该协议定义了getBoundingBoxMin:max:方法。

使用此方法获取附加到节点的几何体的边界框的最小和最大坐标。

然后使用SceneKit原始类型SCNGeometryPrimitiveTypeLine绘制边界框的线条。请参阅SCNGeometryElement。


2
你能否请提供一些示例代码来演示如何实现这个功能?我也在寻找同样的解决方案。 - yaali

-3
如果您的节点是原始形状,您可以将UIImage设置为diffuse。该图像将被拉伸以覆盖您的节点。如果您使用带有边框的图像,则会在节点上创建一个边框。
planeGeometry.firstMaterial?.diffuse.contents = UIImage(named: "blueSquareOutline.png")

Example border image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接