2017-10-17 15 views
0

Je sais comment obtenir des angles avec atan2 entre 2 points en 2D, mais comment cela fonctionne en 3D ?: disons que j'ai 3 points A, B, C (tous sont SCNVector3 avec x Coordonnées y, z, Points de terminaison de première ligne A et B Points de fin de 2e ligne B et C Maintenant, je veux obtenir l'angle entre les 2 lignes ... (dans ios Swift) J'ai lu quelque chose sur le produit scalaire et acos mais d'une certaine manière, il ne fonctionne pas ...Angle entre 2 lignes en 3D

Avec i = 0:

 var vector1 = SCNVector3((pointArray[i].x - pointArray[i+1].x), (pointArray[i].y - pointArray[i+1].y), (pointArray[i].z - pointArray[i+1].z)) 
     var vector2 = SCNVector3((pointArray[i+2].x - pointArray[i+1].x), (pointArray[i+2].y - pointArray[i+1].y), (pointArray[i+2].z - pointArray[i+1].z)) 
     var dotProduct = vector1.x * vector2.x + vector1.y * vector2.y + vector1.z * vector2.z 
     var theta = acos(dotProduct) 
     var tmp_winkel = GLKMathRadiansToDegrees(theta) 

Répondre

1

le dot product prend en compte la norme (grandeur) des vecteurs. Assurez-vous de traiter avec des vecteurs unitaires, ou divisez par le produit de leurs normes.

import SceneKit 
import simd 

var vector1 = float3((pointArray[i].x - pointArray[i+1].x), (pointArray[i].y - pointArray[i+1].y), (pointArray[i].z - pointArray[i+1].z)) 
var vector2 = float3((pointArray[i+2].x - pointArray[i+1].x), (pointArray[i+2].y - pointArray[i+1].y), (pointArray[i+2].z - pointArray[i+1].z)) 
var dotProduct = dot(normalize(vector1), normalize(vector2)) 
var theta = acos(dotProduct) 

ou

var vector1 = float3((pointArray[i].x - pointArray[i+1].x), (pointArray[i].y - pointArray[i+1].y), (pointArray[i].z - pointArray[i+1].z)) 
var vector2 = float3((pointArray[i+2].x - pointArray[i+1].x), (pointArray[i+2].y - pointArray[i+1].y), (pointArray[i+2].z - pointArray[i+1].z)) 
var dotProduct = dot(vector1, vector2) 
var theta = acos(dotProduct)/(length(vector1) * length(vector2)) 
+0

ah je vois, ai oublié de faire la Normaliser, Merci !! Problème restant: direction de l'angle ... comment puis-je savoir s'il est dans le sens horaire ou antihoraire? – cheese

+1

le produit croisé peut aider, voir https://stackoverflow.com/questions/5188561/signed-angle-between-two-3d-vectors-with-same-origin-within-the-same-plane – mnuages

0

donc pour obtenir la direction que je fais maintenant (de mnuages ​​merci pour l'indice):

var vectorn = cross(normalize(vector1), normalize(vector2)) 
if (vectorn.y > 0) { //righ hand side } 
else { //left hand side}