Поднимите "SCNNode" из ориентации

у меня естьSCNBox в сцене SCNS. Как только сцена оживляетSCNBox изменения это ориентация, которую можно увидеть, проверив егоpresentationNode.orientation, Это значение возвращается в SCNVector4. Как определить, какая сторонаSCNBox верхняя сторона от значений, возвращаемых в SCNVector4?

Я попытался нормализовать данные и придумал следующие данные

Side 1 = (-x, 0, 0, +x)
Side 2 = (0, -x, 0 +y)
Side 3 = (-x, +x, -y, y)
Side 4 = (x, x, y, y)
Side 5 = (-x, 0, +y, 0)
Side 6 = (-x, -y, +y, -x) 

К сожалению, это не всегда так, и проверка против этого иногда возвращает неверные стороны.

Есть ли надежный способ определить лицевую сторонуSCNBox из его свойства ориентации геометрии?

Изменить: на основе ответа Toyos, я пришел с следующий код, который не работает. Надеюсь, это поможет приблизиться к конечной цели. Я также использовал код, найденный наИзвлечение вершин из сцены чтобы получить вершины моего SCNBoxNode.

- (NSNumber *)valueForRotation:(SCNVector4)rotation andGeometry:(SCNGeometry*)geometry {
    SCNVector4 inverse = SCNVector4Make(rotation.x, rotation.y, rotation.z, -rotation.w);

    CATransform3D transform = CATransform3DMakeRotation(inverse.w, inverse.x, inverse.y, inverse.z);

    GLKMatrix4 matrix = GLKMatrix4Make(transform.m11, transform.m12, transform.m13, transform.m14, transform.m21, transform.m22, transform.m23, transform.m24, transform.m31, transform.m32, transform.m33, transform.m34, transform.m41, transform.m42, transform.m43, transform.m44);

    GLKVector4 vector = GLKVector4Make(rotation.x, rotation.y, rotation.z, rotation.w);

    GLKVector4 finalVector = GLKMatrix4MultiplyVector4(matrix, vector);

    NSArray *vertexSources = [geometry geometrySourcesForSemantic:SCNGeometrySourceSemanticVertex];

    SCNGeometrySource *vertexSource = vertexSources[0]; // TODO: Parse all the sources

    NSInteger stride = vertexSource.dataStride; // in bytes
    NSInteger offset = vertexSource.dataOffset; // in bytes

    NSInteger componentsPerVector = vertexSource.componentsPerVector;
    NSInteger bytesPerVector = componentsPerVector * vertexSource.bytesPerComponent;
    NSInteger vectorCount = vertexSource.vectorCount;

    SCNVector3 vertices[vectorCount]; // A new array for vertices

    // for each vector, read the bytes
    NSLog(@"vetor count %i",vectorCount);
    float highestProduct = 0;
    int highestVector = -1;
    NSMutableArray *highVectors;
    for (NSInteger i=0; i<vectorCount; i++) {

        // Assuming that bytes per component is 4 (a float)
        // If it was 8 then it would be a double (aka CGFloat)
        float vectorData[componentsPerVector];

        // The range of bytes for this vector
        NSRange byteRange = NSMakeRange(i*stride + offset, // Start at current stride + offset
                                        bytesPerVector);   // and read the lenght of one vector

        // Read into the vector data buffer
        [vertexSource.data getBytes:&vectorData range:byteRange];

        // At this point you can read the data from the float array
        float x = vectorData[0];
        float y = vectorData[1];
        float z = vectorData[2];

        // ... Maybe even save it as an SCNVector3 for later use ...
        vertices[i] = SCNVector3Make(x, y, z);

        // ... or just log it 
        NSLog(@"x:%f, y:%f, z:%f", x, y, z);
        float product = (x * finalVector.x) + (y * finalVector.y) +  (z * finalVector.z);
        if (product > highestProduct) {
            highestProduct = product;
            highestVector = i;
        }

    }

    NSLog(@"highestProduct = %f",highestProduct);
    NSLog(@"highestVector = %i",highestVector);
    NSLog(@"top verticy = %f, %f, %f",vertices[highestVector].x,vertices[highestVector].y,vertices[highestVector].z);

    return [NSNumber numberWithInt:highestVector];
}

Ответы на вопрос(2)

Ваш ответ на вопрос