Как создать линии с начальной и конечной точками в Swift (ARKit, SCNKit) - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу создать строку, чтобы я мог сказать ей, где начинать и где заканчивать сцену в ARKit.Кто-то еще сделал этот класс, но я получаю ошибки.Было бы полезно что-то простое, например startLine в узле ... и endLine в узле ...Я чувствую, что не должно быть так сложно провести простую линию между двумя точками, поэтому, если ваш ответ сложный, объясните, почему так должно быть.Спасибо за вашу помощь!

class LineNode: SCNNode {

private(set) var cylinder: SCNCylinder
private(set) var positionA: SCNVector3
private(set) var positionB: SCNVector3

init(with startingPoint: SCNVector3, endPoint: SCNVector3, radius: Float = 0.02, color: UIColor = .red) {
    self.positionA = startingPoint
    self.positionB = endPoint
    let vector = endPoint - startingPoint  *//error*
    let height = vector.length()
    cylinder = SCNCylinder(radius: radius, height: Float(height))
    cylinder.radialSegmentCount = 8
    cylinder.firstMaterial?.diffuse.contents = color
    super.init()
    geometry = cylinder
    position = (endPoint + startingPoint) / 2   *//error*
    eulerAngles = SCNVector3.lineEulerAngles(vector: vector)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

// Я получаю ошибку: двоичный оператор '-' нельзя применить к двум операндам 'SCNVector3'

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Вам нужно написать расширение, если вы хотите использовать «+/-» в векторе.Просто вставьте это под определение класса.

class ... {
 // class code
}
func + (left: SCNVector3, right: SCNVector3) -> SCNVector3 {
    return SCNVector3Make(left.x + right.x, left.y + right.y, left.z + right.z)
}

func - (left: SCNVector3, right: SCNVector3) -> SCNVector3 {
    return SCNVector3Make(left.x - right.x, left.y - right.y, left.z - right.z)
}

опубликуйте его ниже скобки класса

0 голосов
/ 14 апреля 2019

SCNVector3 - это структура, а не класс.Вы не можете применить оператор «-».

Поэтому мы можем создать еще один SCNVector3, используя старые значения.

let vector = SCNVector3(endPoint.x - startingPoint.x, startingPoint.y, startingPoint.z)
...