Nicht in der Lage zu drehen ein SCNNode in ARKit

Ich bin versucht zu drehen SCNNode auf der y-Achse, so meine Knoten (Pfeil) Punkte in die richtige Richtung. Ich möchte eine navigation-app, die verwendet ARKit; jeder Pfeil muss auf den nächsten Ort der route, die ich erhalten habe. Der Abruf der route funktioniert einwandfrei.

Die Knoten werden Hinzugefügt, um die Stammknotens der Szene. Irgendwann habe ich Durchlaufen ein array von Knoten, um Sie zu positionieren in der Szene und gelten Skalierung der Knoten (aufgrund der Entfernung), die alles richtig gemacht haben. Allerdings, wenn ich mich bewerben rotation, hat dies keine Auswirkung. Die Drehung erfolgt durch ändern der Eigenschaft "Drehung" der Knoten:

directionNode.rotation = SCNVector4(x:0, y:1:, z:0, w:Float(bearing))

Dies hat nicht die gewünschte Wirkung. Ich habe auch versucht, den runAction Methode, auch keine Wirkung:

directionNode.runAction(SCNAction.rotateBy(x: 0, y: CGFloat(bearing), z: 0, duration: 0))

Hier ist der code, Positionen und skaliert den Knoten.

for i in 0...(directionNodes.count - 1) {
    let directionNode = directionNodes[i]
    let translation = MatrixHelper.transformMatrix(for: matrix_identity_float4x4, originLocation: startingLocation, location: directionNode.location)
    let position = SCNVector3.positionFromTransform(translation)
    let distance = directionNode.location.distance(from: startingLocation)
    DispatchQueue.main.async {
        let scale = 100 / Float(distance)
        directionNode.scale = SCNVector3(x: scale, y: scale, z: scale)
        directionNode.anchor = ARAnchor(transform: translation)
        directionNode.position = position
        if (i < (self.directionNodes.count - 1)) {
            // Apply rotation to the arrow
            let successiveStepLocation = self.directionNodes[i + 1].location!
            let bearing = directionNode.location.bearingToLocationRadian(successiveStepLocation)
            // rotate
            directionNode.rotation = SCNVector4(x:0, y:1:, z:0, w:Float(bearing))
        }
    }
}

Dies ist alles verpackt in einem SCNTransaction.

Kann mir jemand sagen, warum die rotation der Knoten nicht funktioniert? Jede Hilfe wird sehr geschätzt.

1 Antworten

  • ARGeo
    3. Mai 2019

    Update: ich Schätze, das problem ist in singleSided shader, die Sie verwenden. Sie sehen, die unsichtbare Seite des Modells. Aktivieren Sie einfach doubleSided material für Ihre geometrie:

    directionNode.geometry?.firstMaterial?.isDoubleSided = true
    

    Sie müssen verwenden Sie die Werte in Bogenmaß ausgedrückt (effektive Reichweite ist -6.28 zu +6.28).

    Es ist wichtig, in welche Richtung, das Objekt wird gedreht >> CW oder CCW. Sie können nicht sehen, die single-sided geometry (in einem bestimmten Winkel) an einem positiven Drehwinkel +.pi.

    Es funktioniert auf diese Weise:

    myNode.rotation = SCNVector4(x: 0, y: 1, z: 0, w: (-.pi * 3) / 2)
    

    ...und wenn Sie SCNAction, auch (und vergessen Sie nicht, weisen Sie eine Dauer):

    let action = SCNAction.repeatForever(SCNAction.rotate(by: -.pi, 
                                                      around: SCNVector3(0,1,0), 
                                                    duration: 1.75))
    myNode.runAction(action)
    

    ...und wenn Sie SCNTransaction auch:

    let previousTransform = myNode.transform
    let rotate = SCNMatrix4MakeRotation(0, 1, 0, (-Float.pi/2))
    
    SCNTransaction.begin()
    SCNTransaction.animationDuration = 3.75
    myNode.transform = SCNMatrix4Mult(rotate, previousTransform)
    SCNTransaction.commit()
    

    enter image description here

    Hoffe, das hilft.