2017-09-20 3 views
0

Dans SceneKit en utilisant Swift, j'essaie de générer la face d'un carré aligné sur l'orientation du noeud pointOfView de la scène, mais j'ai du mal à comprendre les maths requises pour cela.Déplacement de SCNVector3 par rapport à l'orientation SCNNode

Tout ce que je besoin de faire est de prendre la position actuelle du noeud (SCNVector3) et générer ces points par rapport au point central initial, et perpendiculaires à la direction avant de l'appareil photo: enter image description here

Je la direction avant et position actuelle:

let mat = self.sceneView.pointOfView.transform 
let forwardDirection = SCNVector3(-1 * mat.m31, -1 * mat.m32, -1 * mat.m33) 
let position = self.sceneView.pointOfView!.position 

Je n'ai simplement pas été capable de comprendre le reste des mathématiques autour de cela.

Répondre

0

Le noeud pointOfView est essentiellement la caméra active. Vous pouvez donc créer un SCNNode pour tenir le visage (en créant son SCNGeometry), positionner le nœud comme vous le souhaitez, puis ajouter ce nœud en tant que nœud enfant de la caméra. Ensuite, si vous vous déplacez autour de la caméra, le nœud du visage suivra.

Une autre approche qui peut convenir mieux sur la base de votre description limitée serait d'utiliser la scène de superposition de spritekit (puisque ce n'est qu'une seule face).

EDIT: basé sur votre commentaire ci-dessous, s'il vous plaît trouver inclus le code suivant (c'est dans OBJ C, mais il fait le calcul que vous semblez rechercher). Je l'utilise pour quelque chose de similaire, pour l'aligner sur un normal (la variable d'axe ci-dessous est l'entrée normale). La matrice résultante rotMat appliquée aux coordonnées dans votre image devrait faire l'affaire.

// Find a vector in the plane 
    GLKVector3 tangent0 = [self crossVector:axis : GLKVector3Make(1, 0, 0)]; 
    if ([self dotVector:tangent0 : tangent0] < 0.001) { 
     tangent0 = [self crossVector: axis: GLKVector3Make(0, 1, 0)]; 
    } 
    tangent0 = [self normalizeVector: tangent0]; 

    // Find another vector in the plane 
    GLKVector3 tangent1 = [self crossVector: axis: tangent0]; 
    tangent1 = [self normalizeVector: tangent1]; 

    //construct a 4x4 matrix using tangents and initial axis 
    GLKVector4 tangent0GLK4 = GLKVector4Make(tangent0.x, tangent0.y, tangent0.z, 0); 
    GLKVector4 tangent1GLK4 = GLKVector4Make(tangent1.x, tangent1.y, tangent1.z, 0); 
    GLKVector4 axisGLK4 = GLKVector4Make(axis.x, axis.y, axis.z, 0); 

    GLKMatrix4 rotMat = GLKMatrix4MakeWithColumns(tangent0GLK4, tangent1GLK4, axisGLK4, GLKVector4Make(0, 0, 0, 1)); 
+0

Merci, mais j'utilise en fait cela pour dessiner la géométrie pour une forme que je veux avoir une texture sur à travers la géométrie qui obtient ces sommets ajoutés chaque fois que le noeud pov est mis à jour, donc ce ne sera pas travaille pour moi. – harryisaac

+0

Ok, j'ai ajouté un peu de code à ma réponse qui, je pense, fait le calcul dont vous avez besoin, j'espère que ça aide! – Xartec