SCNShape使用贝塞尔曲线路径

3

我正在尝试在Scenekit iOS中绘制一条3D线,我正在尝试使用以下代码绘制线条:

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)

但是,我得到的是空白屏幕。


你的“三角形”在屏幕后面15米处。 - Nativ
3个回答

3
尝试更改您几何体的材质。您可能会遇到白色背景上的白色对象。
编辑: 事实证明,您三角形的顶点共线。因此,您最终会得到一个退化的三角形。

虽然我改变了材料的颜色,但它没有起作用。 - user2781412
顶点共线,你的三角形是扁平的。 - mnuages

3

由于你从(0,0)开始,画一条线到(10,10),然后再画一条线到(5,5),这已经在(0,0)和(10,10)之间的直线上了,因此你的路径没有表面积。然后,通过向(0,0)画另一条线来关闭路径。

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

此外,z轴指向屏幕外部。这意味着,根据相机的位置,你可能会将carbonNode放在相机的后面。如果你想将其定位到场景更远的位置,则应该使用负的z值。


如果场景中没有手动添加相机,SceneKit 将自动放置一个并将其配置为显示场景内容的整个边界框。不知道 OP 是否已经放置了相机,所以 carbonNode.position 可能是一个问题,也可能不是。(共线顶点肯定是问题。) - rickster

2

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

    // 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比例尺都是以米为单位的。因此,请将数字设置为与您创建的其他形状相似的值。


SceneKit单位仅在您开始使用物理系统(因此需要处理质量和加速度之间的关系)或导出到文件格式以供某些关心现实世界空间的其他应用程序使用(例如,用于建筑或3D打印)时才为“米”。否则它们是任意的和可扩展的。也许您想说的是,在创建Bézier路径时使用的2D点与场景的3D空间处于相同的比例尺上。(很容易错误地将它们视为更小的“像素”)。 - rickster

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