具有贝塞尔曲线路径的 SCNShape

SCNShape with bezier path

我想在 Scenekit 中画一条 3d 线 iOS,我正在尝试用下面的代码画线,

func path() -> UIBezierPath
    {
        var bPath = UIBezierPath()
        bPath.moveToPoint(CGPointMake(0, 0))
        bPath.addLineToPoint(CGPointMake(10, 10))
        bPath.addLineToPoint(CGPointMake(5, 5))
        bPath.closePath()
        return bPath
    }

下面的代码是加载SCNNode中的行,

let sap = SCNShape()
    sap.path = path()
    let carbonNode = SCNNode(geometry: sap)
    carbonNode.position = SCNVector3Make(0, 0, 15)
    scene.rootNode.addChildNode(carbonNode)

但是,我得到黑屏。

尝试更改几何体的材质。您可能在白色背景上有一个白色物体。

编辑: 结果还证明三角形的顶点是共线的。因此,你最终得到一个退化的三角形。

你的路径没有表面积,因为你从 (0,0) 开始,画一条线到 (10, 10),然后画第二条线到 (5,5),它已经在 (0) 之间的线上,0) 和 (10, 10)。然后通过在 (0,0) 绘制另一条线来关闭路径。

改变这三个点中的任何一个都会创建一个具有表面积的路径。

另外,z轴指向屏幕外。这意味着根据相机的位置,您可能会将 carbonNode 放在相机后面。相反,如果您打算将它进一步定位到场景中,您应该使用负 z 值。

这是我为解决该问题而编写的一些代码。

    // Material colors
    let cyanMaterial = SCNMaterial()
    cyanMaterial.diffuse.contents = UIColor.cyanColor()

    let anOrangeMaterial = SCNMaterial()
    anOrangeMaterial.diffuse.contents = UIColor.orangeColor()

    let aPurpleMaterial = SCNMaterial()
    aPurpleMaterial.diffuse.contents = UIColor.purpleColor()

    // A bezier path
    let bezierPath = UIBezierPath()
    bezierPath.moveToPoint(CGPointMake(-0.25, 0))
    bezierPath.addLineToPoint(CGPointMake(0, -0.25))
    bezierPath.addLineToPoint(CGPointMake(0.25, 0))
    bezierPath.addLineToPoint(CGPointMake(0, 0.25))
    bezierPath.closePath()

    // Add shape
    let shape = SCNShape(path: bezierPath, extrusionDepth: 0.75)
    shape.materials = [cyanMaterial, anOrangeMaterial, aPurpleMaterial]
    let shapeNode = SCNNode(geometry: shape)
    shapeNode.position = SCNVector3(x: 0.2, y: 0.75, z: 0.1);
    self.rootNode.addChildNode(shapeNode)
    shapeNode.rotation = SCNVector4(x: -1.0, y: -1.0, z: 0.0, w: 0.0)

请记住,Scene Kit 比例的数字以米为单位。因此,将数字设置为与适用于您创建的其他形状的数字类似。