2017-10-17 125 views
0

我知道如何在2D中得到2点之间的atan2角度,但是这是如何在3D中工作的: 可以说我有3点A,B,C(都是SCNVector3,带有x ,y,z坐标 第一条线端点A和B 第二条线端点B和C 现在我想要得到两条线之间的角度......(在ios Swift中) 我读了一些关于dot产品和acos的内容,但不知它不工作...3D中两条线之间的夹角

其中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) 

回答

1

dot product将矢量的规范(大小)考虑在内。确保你处理单位向量,或除以他们的规范的乘积。

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) 

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

我明白了,忘了做正规化,谢谢!剩余的问题:角度的方向...我怎么知道它是顺时针还是逆时针? – cheese

+1

跨产品可以帮助,请参阅https://stackoverflow.com/questions/5188561/signed-angle-between-two-3d-vectors-with-same-origin-within-the-same-plane – mnuages

0

所以让我现在做的方向(感谢mnuages的提示):

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