Math 围绕向量3d旋转点

Math 围绕向量3d旋转点,math,matrix,vector,rotation,Math,Matrix,Vector,Rotation,我想旋转一个P3,它靠近一个向量,这个向量与P1和P2相交x度 P1和P2是与图像中的矢量线e相交的2个点。我做了很多研究和搜索,找到了一些好的材料,但是我的三角法技能太差了。我需要这个为兵小,这里我有一些代码,但并没有真正的工作预期。如果有人能帮助我,我将非常感激: 图像链接: P1/P2/P3=x,y,z float vec[3]; SubtractVectors(P1, P2, vec); float newp[3]; float rotation[4][4]; SetupMatrix(

我想旋转一个P3,它靠近一个向量,这个向量与P1和P2相交x度

P1和P2是与图像中的矢量线e相交的2个点。我做了很多研究和搜索,找到了一些好的材料,但是我的三角法技能太差了。我需要这个为兵小,这里我有一些代码,但并没有真正的工作预期。如果有人能帮助我,我将非常感激:

图像链接:

P1/P2/P3=x,y,z

float vec[3];
SubtractVectors(P1, P2, vec);

float newp[3];
float rotation[4][4];
SetupMatrix(90.0, vec, rotation);
MultiplyMatrix(P3, rotation, newp);
//-----------------

stock void MultiplyMatrix(float input[3], float rotation[4][4], float output[3])
{
    float input2[4];
    input2[0] = input[0];
    input2[1] = input[1];
    input2[2] = input[2];
    input2[3] = 1.0;

    float output2[4];
    for(int i = 0 ; i < 4 ; i++)
    {
        for(int j = 0 ; j < 4 ; j++)
        {
            output2[i] += rotation[i][j] * input2[j];
        }
    }

    output[0] = output2[0];
    output[1] = output2[1];
    output[2] = output2[2];
}

stock void SetupMatrix(float angle, float vector[3], float rotation[4][4])
{
    float L = (vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]);
    angle = angle * M_PI / 180.0;
    float u2 = vector[0] * vector[0];
    float v2 = vector[1] * vector[1];
    float w2 = vector[2] * vector[2];

    rotation[0][0] = (u2 + (v2 + w2) * Cosine(angle)) / L;
    rotation[0][1] = (vector[0] * vector[1] * (1 - Cosine(angle)) - vector[2] * SquareRoot(L) * Sine(angle)) / L;
    rotation[0][2] = (vector[0] * vector[2] * (1 - Cosine(angle)) + vector[1] * SquareRoot(L) * Sine(angle)) / L;
    rotation[0][3] = 0.0; 

    rotation[1][0] = (vector[0] * vector[1] * (1 - Cosine(angle)) + vector[2] * SquareRoot(L) * Sine(angle)) / L;
    rotation[1][1] = (v2 + (u2 + w2) * Cosine(angle)) / L;
    rotation[1][2] = (vector[1] * vector[2] * (1 - Cosine(angle)) - vector[0] * SquareRoot(L) * Sine(angle)) / L;
    rotation[1][3] = 0.0; 

    rotation[2][0] = (vector[0] * vector[2] * (1 - Cosine(angle)) - vector[1] * SquareRoot(L) * Sine(angle)) / L;
    rotation[2][1] = (vector[1] * vector[2] * (1 - Cosine(angle)) + vector[0] * SquareRoot(L) * Sine(angle)) / L;
    rotation[2][2] = (w2 + (u2 + v2) * Cosine(angle)) / L;
    rotation[2][3] = 0.0; 

    rotation[3][0] = 0.0;
    rotation[3][1] = 0.0;
    rotation[3][2] = 0.0;
    rotation[3][3] = 1.0;
}

看看四元数,它们正是你所需要的。如果你不像我一样使用它们,那么:

构造表示旋转轴坐标系的变换矩阵M

首先看这里:。例如,原点是点P1,因此X轴是P2-P1旋转轴。让Q=1.0,0.0,0.0或0.0,1.0,0.0选择一个与X轴矢量不平行的矢量,因此

X = P2-P1
Q = (1.0,0.0,0.0) or (0.0,1.0,0.0)
Y = cros(X,Q)
Z = cros(X,Y)
现在,如果需要,可以对轴求反或更改其叉积操作数以匹配所需的轴方向。另外,不要忘记将所有轴设置为单位向量

现在做局部坐标系LCS旋转

在答案的末尾搜索lrotx

所以现在

以要旋转的GCS点p为例,获取未旋转变换矩阵M的LCS坐标

轮换:

M = inverse(inverse(M)*rotation)
将Q转换回地面军事系统

这就是一切

[附注]


如果你有错误的旋转方向,那么只需对其中一个轴求反。。。或者使用否定角度

谢谢,我真的解决了这个问题。将旋转[0][3]/[1][3]/[2][3]替换为旋转矩阵公式->中的最后一列,其中a、b、c=P1,因为我的向量不是从0,0,0开始的,现在按预期工作。谢谢你的提示:
M = inverse(inverse(M)*rotation)
Q = M*Q