UIBezierPath Quadratic Curve является прямой линией - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь создать изогнутую стрелку для отображения в сцене ab ARKit, однако кривизна посоха стрелы просто отрисовывается как прямая линия с обеих сторон.

func createTurnArrow(_ direction: Direction) -> SCNShape {
    let path = UIBezierPath()
    path.move(to: CGPoint(x: 0.2, y: 0)) // A
    path.addLine(to: CGPoint(x: 0, y: 0.2)) // B
    path.addLine(to: CGPoint(x: 0, y: 0.1)) // C
    path.addQuadCurve(to: CGPoint(x: -0.3, y: -0.3), controlPoint: CGPoint(x: -0.3, y: 0.1)) // Curve 1
    path.addLine(to: CGPoint(x: -0.1, y: -0.3)) // D
    path.addQuadCurve(to: CGPoint(x: 0, y: -0.1), controlPoint: CGPoint(x: -0.1, y: -0.1)) // Curve 2
    path.addLine(to: CGPoint(x: 0, y: -0.2)) // E
    path.close()

    return direction == .left ?
      SCNShape(path: path.reversing(), extrusionDepth: self.defaultDepth) :
      SCNShape(path: path, extrusionDepth: self.defaultDepth)
}

Моя интуиция подсказывает мне, что создайте узел с помощью этой функции:

SCNNode(geometry: createTurnArrow(.right))

должен создать такую ​​форму:

enter image description here

но вместо этого выводит это без каких-либо кривых в хвост стрелки:

enter image description here

Я пробовал кучу других математических заданий, чтобы получить текущие контрольные точки для квадратичных кривых, но ничего страшного. Есть идеи?

EDIT:

Где находится схема с нанесенными точками и мое предположение о том, как это должно быть отображено с помощью кривых.

enter image description here

1 Ответ

0 голосов
/ 15 ноября 2018

Чтение SCNShape path документации . Это говорит это:

Плоскостность пути (см. flatness в NSBezierPath) определяет уровень детализации, который SceneKit использует при построении трехмерной фигуры по траектории - чем больше значение плоскостности, тем меньше рендеринга полигонов, что повышает производительность.

(Поскольку вы используете iOS, замените UIBezierPath на NSBezierPath.)

Что такое flatness по умолчанию UIBezierPath? Вот что документация говорит:

Значение плоскостности измеряет наибольшее допустимое расстояние (в пикселях) между точкой на истинной кривой и точкой на визуализированной кривой. Меньшие значения приводят к более плавным кривым, но требуют большего времени вычисления. Большие значения приводят к более неровным кривым, но отображаются намного быстрее. Значение плоскостности по умолчанию составляет 0,6.

Теперь сравните плоскостность по умолчанию (0,6) с общим размером вашей фигуры (0,5 × 0,5). Обратите внимание, что плоскостность больше, чем размер вашей формы! Таким образом, каждая из ваших кривых сглаживается до одной прямой линии.

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

let path = UIBezierPath()
path.flatness = 0.05 // <----------------------- insert this statement
path.move(to: CGPoint(x: 0.2, y: 0)) // A
path.addLine(to: CGPoint(x: 0, y: 0.2)) // B
// etc.
...