【问题标题】:Angle between 2 Lines in 3D3D 中 2 条线之间的角度
【发布时间】:2017-10-17 12:30:28
【问题描述】:

我知道如何在 2D 中使用 atan2 获得 2 点之间的角度,但这在 3D 中如何工作?: 假设我有 3 个点 A、B、C(都是 SCNVector3,具有 x、y、z 坐标 第一行端点 A 和 B 第二行端点 B 和 C 现在我想得到两条线之间的角度......(在 ios Swift 中) 我读过一些关于点积和 acos 的东西,但不知何故它不起作用......

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

【问题讨论】:

    标签: swift scenekit


    【解决方案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)))
    

    【讨论】:

    • 啊,我明白了,忘了做标准化,谢谢!!剩下的问题:角度的方向......我怎么知道它是顺时针还是逆时针?
    • 叉积可以帮忙,见stackoverflow.com/questions/5188561/…
    • @mnuages 我需要一些帮助来获取 SCNVector3 数组的线数之间的角度吗?这对我很有帮助。
    【解决方案2】:

    所以为了得到我现在做的方向(感谢 mnuages 的提示):

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多