【问题标题】:SCNShape with bezier path具有贝塞尔路径的 SCNShape
【发布时间】:2015-12-05 01:51:04
【问题描述】:

我想在 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 米处

标签: ios swift scenekit


【解决方案1】:

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

编辑: 事实证明,你的三角形的顶点是共线的。因此,您最终会得到一个退化的三角形。

【讨论】:

  • 虽然我改变了材质颜色,但它不起作用。
  • 顶点是共线的,你的三角形是平的。
【解决方案2】:

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

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

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

【讨论】:

  • 如果场景中没有手动添加摄像头,SceneKit 会自动放置一个并配置它以显示场景内容的整个边界框。不知道 OP 是否放置了摄像头,所以 carbonNode.position 可能是也可能不是问题。 (共线顶点当然是。)
【解决方案3】:

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

    // 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 打印)。否则它们是任意的和可扩展的。也许您的意思是您在创建贝塞尔路径时使用的 2D 点与场景的 3D 空间具有相同的比例。 (很容易将它们误认为是小得多的“像素”。)
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2011-03-30
  • 2011-02-26
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多