SCNShape с путем Безье

Я пытаюсь нарисовать трехмерную линию в Scenekit 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)

Но я получаю пустой экран.


person user2781412    schedule 28.01.2015    source источник
comment
Ваш треугольник находится в 15 метрах от экрана.   -  person Nativ    schedule 13.12.2018


Ответы (3)


попробуйте изменить материалы вашей геометрии. У вас может быть белый объект на белом фоне.

edit: также оказывается, что вершины вашего треугольника коллинеарны. Таким образом, вы получите вырожденный треугольник.

person mnuages    schedule 28.01.2015
comment
Хотя я изменил цвет материала, это не работает. - person user2781412; 28.01.2015
comment
вершины коллинеарны, ваш треугольник плоский. - person mnuages; 28.01.2015

Ваш путь не имеет площади поверхности, так как вы начинаете с (0,0), рисуете линию до (10, 10), а затем вторую линию до (5,5), которая уже находится на линии между (0,0) и ( 10, 10). Затем вы закрываете путь, рисуя другую линию до (0,0).

Изменение любой из трех точек создает путь с площадью поверхности.

Кроме того, ось Z указывает за пределы экрана. Это означает, что в зависимости от того, где расположена ваша камера, вы можете разместить carbonNode за камерой. Если вместо этого вы хотели расположить его дальше в сцене, вам, вероятно, следует использовать отрицательное значение z.

person David Rönnqvist    schedule 28.01.2015
comment
Если в сцену вручную не добавлена ​​камера, SceneKit автоматически разместит ее и настроит для отображения всей ограничивающей рамки содержимого сцены. Не знаю, поставил ли OP камеру, так что carbonNode.position может быть проблемой, а может и не быть. (Колинеарные вершины, безусловно, есть.) - person rickster; 28.01.2015

Вот некоторый код, который я написал для решения проблемы.

    // 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)

Имейте в виду, что числа, масштаб набора сцен, указаны в метрах. Поэтому установите числа аналогично тем, которые работают для других форм, которые вы создаете.

person Jerry Frost    schedule 04.12.2015
comment
Единицы SceneKit являются метрами только тогда, когда вы начинаете работать с физической системой (и, следовательно, должны работать с взаимосвязью между массой и ускорением) или экспортируете в формат файла для использования в каком-либо другом приложении, которое заботится о реальном пространстве (скажем, для архитектура или 3D-печать). В противном случае они произвольны и масштабируемы. Возможно, вы хотите сказать, что 2D-точки, которые вы используете при создании пути Безье, имеют тот же масштаб, что и 3D-пространство вашей сцены. (Легко ошибочно принять их за пиксели, которые намного меньше.) - person rickster; 04.12.2015