Опираясь на 3d-объект

Я создал образец приложения для рисования на 3d-объектах, выходной чертеж не является гладким (как на рисунке). Я потратил почти день, чтобы выяснить, что еще не может решить проблема. Что может быть проблемой? введите описание изображения здесь

Я создаю собственную геометрию чертежа, как показано ниже

//I am creating self.drawingNode touches begin and adding to the rootnode
//points are nothing but 2d points from touches

func createGeometryForPoints(points:[CGPoint]) -> SCNGeometry {

        var all_3d_points:[SCNVector3] = []            
        for point in points {
            let result = self.get3dPoint(point)
            if result.1 == true {
                all_3d_points.append(result.0)
            }
            else {
                print("INVALID POINT")
            }
        }


        var indices: [Int32] = []
        var index:Int32 = 0

        var previousIndex:Int32 = -1
        for _ in all_3d_points {
            if(previousIndex != -1){
                indices.append(previousIndex)
            }
            indices.append(index)
            index = index + 1
            previousIndex = index
        }

        if indices.count > 0{
            indices.removeLast();
        }

        let indexData = NSData(bytes: indices, length: sizeof(Int32) * indices.count)

        let source = SCNGeometrySource.init(vertices: all_3d_points, count: all_3d_points.count)
        let element = SCNGeometryElement.init(data: indexData, primitiveType: .Line, primitiveCount: indices.count/2, bytesPerIndex: sizeof(Int32))

        let line = SCNGeometry(sources: [source], elements: [element])
        line.materials.first?.diffuse.contents = UIColor.redColor()
        line.materials.first?.doubleSided = true

        return line
    }

func get3dPoint(point:CGPoint) -> (SCNVector3,Bool) {

    var canAdd = false
    let scnView = self.view as! SCNView
    var unprojectedStartPoint = SCNVector3.init(x:Float(point.x), y:Float(point.y), z:0)

    let hitResults = scnView.hitTest(point, options: nil)
    if hitResults.count > 0 {

        let result: AnyObject! = hitResults[0]
        if hitResults.count > 1 {
            print("SOME PROBLEM")
        }
        unprojectedStartPoint = result.localCoordinates
        unprojectedStartPoint = result.node.convertPosition(unprojectedStartPoint, toNode: self.drawingNode!)

        canAdd = true
    }

    return (unprojectedStartPoint,canAdd)
}

EDIT

Я собираюсь найти смещение вместе с направлением камеры или нормальным, так как я новичок в scenekit, я не понимаю, как добавить это смещение к рисунку node, глядя на помощь здесь в этом направлении

func createMarkup() -> Void {   
    let drawingNode = SCNNode()
    drawingNode.renderingOrder = 1000
    self.parentNode!.addChildNode(drawingNode)
    let geometry = self.createGeometryForPoints(allPoints,node: drawingNode)
    drawingNode.geometry = geometry
    drawingNode.geometry?.materials.first?.doubleSided = true
}

EDIT: 2

Решена проблема, добавив незначительное смещение по нормали теста-хита

let offsetToAvoidFlickering: Float = 0.05
unprojectedStartPoint = unprojectedStartPoint + result.localNormal.normalized() * offsetToAvoidFlickering

Ответ 1

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

Ответ 2

Пример SceneKit State of Demo показывает аналогичный эффект, где вы можете рисовать на торе. Он более мощный, потому что вы можете рисовать что угодно (не только линию, но брызги от текстуры и т.д.) И намного более эффективно, потому что не полагаются на создание новой геометрии.