【问题标题】:Rotate point around vector 3d围绕矢量 3d 旋转点
【发布时间】:2014-10-25 10:22:55
【问题描述】:

我想将 P3(附近的某个地方)围绕一个向量(与 P1 和 P2 相交)旋转 x 度。

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

图片链接:http://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Euler_AxisAngle.png/220px-Euler_AxisAngle.png

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;
}

【问题讨论】:

    标签: math matrix vector rotation


    【解决方案1】:

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

    1. 构造变换矩阵M代表你的旋转轴坐标系

      首先看这里:transform matrix anatomy。例如原点是点P1 所以X 轴是P2-P1(旋转轴)。让Q = (1.0,0.0,0.0)(0.0,1.0,0.0) 选择一个不平行于X 轴向量的so

      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)
      

      现在您可以否定轴或更改它们的叉积操作数顺序以匹配您需要的轴方向(如果需要)。也不要忘记将所有轴设为单位向量

    2. 现在进行局部坐标系 (LCS) 旋转

      看这里LCS transforms 和这里LCS rotation around X axis lrotx C++ implementation 在答案末尾搜索lrotx

    3. 现在就这样

      GCSP要旋转得到它的LCS坐标(对于未旋转的变换矩阵M

      Q = inverse(M)*P // if `M` before rotation was one then you can do Q=P instead
      

      旋转:

      M = inverse(inverse(M)*rotation)
      

      Q转换回GCS

      Q = M*Q
      

      就是这样……

    [备注]

    如果您的旋转方向错误,则只需否定其中一个轴...或使用否定角度

    【讨论】:

    • 谢谢,我确实解决了这个问题。用旋转矩阵公式的最后一列替换了 rotation[0][3] / [1][3] / [2][3] -> inside.mines.edu/fs_home/gmurray/ArbitraryAxisRotation/… 其中 a,b,c = P1 因为我的向量没有开始从 (0,0,0) 开始,现在按预期工作。感谢您的提示:)
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多