Algorithm 将2个三维点转换为方向向量,再转换为Euler角度

Algorithm 将2个三维点转换为方向向量,再转换为Euler角度,algorithm,vector,3d,euler-angles,Algorithm,Vector,3d,Euler Angles,这基本上是我的问题。也可能我对欧拉角不够熟悉,我尝试做的是不可能的 我在3d空间中有2个点 p1(1,2,3) p2(4,5,6) 为了得到这两点的单位向量,我基本上是这样做的 var productX = (position.X2 - position.X1); var productY = (position.Y2 - position.Y1); var productZ = (position.Z2 - position.Z1);

这基本上是我的问题。也可能我对欧拉角不够熟悉,我尝试做的是不可能的

我在3d空间中有2个点

p1(1,2,3)
p2(4,5,6)

为了得到这两点的单位向量,我基本上是这样做的

        var productX = (position.X2 - position.X1);
        var productY = (position.Y2 - position.Y1);
        var productZ = (position.Z2 - position.Z1);

        var normalizedTotal = Math.sqrt(productX * productX + productY * productY + productZ * productZ);

        var unitVectorX, unitVectorY, unitVectorZ;
        if(normalizedTotal == 0)
        {
            unitVectorX = productX;
            unitVectorY = productY;
            unitVectorZ = productZ;
        }
        else
        {
            unitVectorX = productX / normalizedTotal;
            unitVectorY = productY / normalizedTotal;
            unitVectorZ = productZ / normalizedTotal;
        }
现在我有了这两个3d点的单位向量xyz

我现在尝试将方向向量转换为欧拉角。这可能吗。我在这里遗漏了什么,因为我找不到任何关于如何做到这一点的好资源

谢谢你的帮助

有时候一张照片会有帮助

也许这将为我试图解决的问题提供一个更好的例子


给定2个点,我已经确定了一个中点,长度,现在我试图计算出要设置的角度,这样圆柱体就可以正确地围绕x,y,z轴定向。我想我需要计算出所有3个角度,不仅仅是1和2,对吗?我认为欧拉角是从一个方向向量开始的

您需要的是从向量的笛卡尔坐标变换

v = (v_x, v_y, v_z)
球坐标
r
ψ
θ
,其中

v = ( r*COS(ψ)*COS(θ), r*SIN(θ), r*SIN(ψ)*COS(θ) )
这是通过以下方程式完成的

r = SQRT(v_x^2+v_y^2+v_z^2) 
TAN(ψ) = (v_z)/(v_x)
TAN(θ) = (v_y)/(v_x^2+v_z^2)
要获得角度ψ和θ,请使用中的函数

ψ = ATAN2(v_z, v_x)
θ = ATAN2(v_y, SQRT(v_x^2+v_z^2))
现在有了方向向量

j = ( COS(ψ)*COS(θ), SIN(θ), SIN(ψ)*COS(θ) )
你可以从中得到两个垂直向量

i = ( SIN(ψ), 0, -COS(ψ) )
k = ( COS(ψ)*SIN(θ), -COS(θ), SIN(ψ)*SIN(θ) )
这三个向量构成了3×3旋转矩阵的列

             |  SIN(ψ)   COS(ψ)*COS(θ)    COS(ψ)*SIN(θ)  |
E =[i j k] = |    0          SIN(θ)          -COS(θ)     |
             | -COS(ψ)   SIN(ψ)*COS(θ)    SIN(ψ)*SIN(θ)  |
就欧拉角而言,上述等效于

E = RY(π/2-ψ)*RX(π/2-θ)
例子 两个点
p_1=(3,2,3)
p_2=(5,6,4)
定义向量

v = (5,6,4) - (3,2,3) = (2,4,1)
注:对于向量的
I-th
元素,我使用了
v[I]
符号,如上面的
v[1]=2
。这既不像是基于零的
C
Python
,也不像是使用parens
()
作为索引的
VB
FORTRAN
MATLAB

使用上面的表达式可以得到

r = √(2^2+4^2+1^2) = √21
TAN(ψ) = 1/2 
TAN(θ) = 4/√(2^2+1^2) = 4/√5

ψ = ATAN2(1,2) = 0.463647 
θ = ATAN2(4,√5) = 1.061057
现在来寻找方向向量

j = ( COS(ψ)*COS(θ), SIN(θ), SIN(ψ)*COS(θ) ) = (0.4364, 0.87287, 0.21822 )
i = ( SIN(ψ), 0, -COS(ψ) ) = (0.44721, 0, -0.89443 )
k = ( COS(ψ)*SIN(θ), -COS(θ), SIN(ψ)*SIN(θ) ) = (0.78072, -0.48795, 0.39036) 
将方向向量作为局部到世界坐标变换(旋转)的列


为什么笛卡尔坐标到球面坐标的转换不起作用?欧拉角在这里可能有点过分了。如果以2个点p1(1,2,3)p2(4,5,6)为例,你是否可以这样做。这些点不是一个好例子,因为向量(坐标差)只是
(3,3,3)
。我将使用不同的点作为例子。感谢ja72的例子。我需要一些时间来分析这个。
E[1,1] = i[1]    E[1,2] = j[1]    E[1,3] = k[1]
E[2,1] = i[2]    E[2,2] = j[2]    E[2,3] = k[2]
E[3,1] = i[3]    E[3,2] = j[3]    E[3,3] = k[3]


    |  0.447213595499957  0.436435780471984   0.780720058358826 |
    |                                                           |
E = |          0          0.872871560943969  -0.487950036474266 |
    |                                                           |
    | -0.894427190999915  0.218217890235992   0.390360029179413 |