Incapaz de girar un SCNNode en ARKit

Estoy tratando de girar un SCNNode en el eje y, entonces, mi nodo (una flecha) apunta en la dirección correcta. Quiero hacer una aplicación de navegación que utiliza ARKit; cada flecha debe apuntar a la siguiente ubicación de la ruta que he recibido. La recuperación de la ruta funcione correctamente.

Los nodos se agregan a la nodoraíz de la escena. En algún momento me atraviesan una serie de nodos a la posición en la escena y aplicar el escalado para el nodo (basado en la distancia), que se hace todo correctamente. Sin embargo, al aplicar la rotación, esto no tiene ningún efecto. La rotación se realiza mediante la modificación de la propiedad de rotación del nodo:

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

Este no tiene el efecto deseado. También traté de usar el runAction método, también sin efecto:

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

Aquí está el código que las posiciones y las escalas de los nodos.

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

Todo esto está envuelto en una SCNTransaction.

¿Alguien puede decirme por qué la rotación del nodo no está funcionando? Cualquier ayuda es muy apreciada.

1 Respuestas

  • ARGeo
    3 de mayo de 2019

    Actualización: yo creo que el problema está en singleSided sombreado que se está utilizando. Vea el lado invisible de su modelo. Simplemente active doubleSided el material para su geometría:

    directionNode.geometry?.firstMaterial?.isDoubleSided = true
    

    Usted necesidad de utilizar valores expresados en Radianes (rango efectivo es -6.28 a +6.28).

    Es importante en lo que la dirección de su objeto se gira >> CW o CCW. Usted no puede ver el single-sided geometry (en un cierto ángulo) en un ángulo positivo de rotación +.pi.

    Funciona de esta manera:

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

    ...y cuando estás utilizando SCNAction, (y no te olvides de asignar una duración):

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

    ...y cuando estás utilizando SCNTransaction, y también:

    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

    Espero que esto ayude.