在没有对角线的情况下绘制SCNBox的边缘?

时间:2017-12-27 23:07:13

标签: swift scenekit arkit scnnode

我正在使用Apple的ARKit制作AR应用程序,我想制作框架的线框轮廓。代码中描述的和图片中显示的那个在盒子的每个面上绘制斜边。它还隐藏在盒子另一侧的角落。在Scene Kit中是否有一种方法可以摆脱对角线并使其变为透明,显示所有边缘和顶点?

let box:SCNNode = SCNNode(geometry: SCNBox(width: CGFloat(0.1), height: CGFloat(0.1), length: CGFloat(0.1), chamferRadius: CGFloat(0)))
box.geometry?.firstMaterial?.fillMode = .lines
box.geometry?.firstMaterial?.diffuse.contents = UIColor.green

Current SCNBox

3 个答案:

答案 0 :(得分:5)

我不确定如何摆脱对角线。

但是将材质设置为双面将在框的另一侧绘制线条。

 box.geometry?.firstMaterial?.isDoubleSided = true

编辑:

这是实现你想要的另一种方法(摆脱那些对角线!)

enter image description here

let sm = "float u = _surface.diffuseTexcoord.x; \n" +
    "float v = _surface.diffuseTexcoord.y; \n" +
    "int u100 = int(u * 100); \n" +
    "int v100 = int(v * 100); \n" +
    "if (u100 % 99 == 0 || v100 % 99 == 0) { \n" +
    "  // do nothing \n" +
    "} else { \n" +
    "    discard_fragment(); \n" +
    "} \n"

let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)

box.firstMaterial?.emission.contents = UIColor.green

box.firstMaterial?.shaderModifiers = [SCNShaderModifierEntryPoint.surface: sm] 

box.firstMaterial?.isDoubleSided = true

答案 1 :(得分:1)

使用SCNGeometry创建SCNBox对象时,创建的几何图形由12个三角形组成,当您将fillMode设置为.lines时,SceneKit会绘制每个三角形的边缘那些三角形。这意味着除非您在调用SCNBox之后自己修改几何体或创建自定义几何体,告诉SceneKit确切地绘制哪条线,否则我认为您无法摆脱这些对角线。

答案 2 :(得分:0)

一种方法是制作透明的.png图像纹理,除了边缘周围的边框。

然后,将其附加到要创建的任何对象上,作为材料的diffuse内容。 (我确实使用了委托方法,但是可以很容易地将其提取到最终生成几何的任何类中。)

// MARK: - ARSCNViewDelegate
// Override to create and configure nodes for anchors added to the view's session.
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

    // Create our Cube
    let shape = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)

    let material = SCNMaterial()
    material.isDoubleSided = true
    material.diffuse.contents = UIImage(named: "art.scnassets/border.png")
    material.transparencyMode = .aOne

    shape.materials = [material]

    // Throw it on a node
    let newNode = SCNNode(geometry: shape)

    return newNode
}