罗德里格斯矢量旋转公式



我正在尝试执行Rodrigues的公式,以绕任意轴旋转一定角度。我有这个代码

function norm(v) {
    return Math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
}
function normalize(v) {
    var length = norm(v);
    return [v[0]/length, v[1]/length, v[2]/length];
}
function dotProduct(v1, v2) {
    return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
}
function crossProduct(v1, v2) {
    return [v1[1]*v2[2] - v1[2]*v2[1], v1[2]*v2[0] - v1[0]*v2[2], v1[0]*v2[1] - v1[1]*v2[0]];
}
function getAngle(v1, v2) {
    return Math.acos(dotProduct(v1, v2) / (norm(v1)*norm(v2)));
}
function matrixMultiply(matrix, v) {
    return [dotProduct(matrix[0], v), dotProduct(matrix[1], v), dotProduct(matrix[2], v)];
}
function aRotate(p, v, a) {
    var ca = Math.cos(a), sa = Math.sin(a), t=1-ca, x=v[0], y=v[1], z=v[2];
    var r = [
        [ca + x*x*t, x*y*t - z*sa, x*z*t + y*sa],
        [x*y*t + z*sa, ca + y*y*t, y*z*t - x*sa],
        [z*x*t - y*sa, z*y*t + x*sa, ca + z*z*t]
    ];
    return matrixMultiply(r, p);
}
var v1 = [5,-6,4];
var v2 = [8,5,-30];
var a = getAngle(v1, v2);
var cp = crossProduct(v1, v2);
var ncp = normalize(cp);
var np = aRotate(v1, ncp, a);
console.log(np); // <---- this is wrong result

因此,我从2个向量开始,从它们之间获得角度,得到垂直矢量并将其归一化,然后测试矩阵,看看如果我输入V1,我是否会返回V2。但是我没有回来。有人知道我在哪里做错了吗?我认为这是在矩阵代码中。我回来[2.232221073308228, 1.3951381708176427, -8.370829024905852]

公式在这里https://en.wikipedia.org/wiki/rotation_matrix在旋转矩阵下,轴和角度

谢谢

我认为这里没有问题。

np是正确方向的向量(与v2相同的方向),但幅度错误。您可以看到:

console.log(normalize(v2), normalize(np));

结果是:

[0.254385200299, 0.1589907501872, -0.953944501123] [0.254385200299, 0.1589907501872, -0.953944501123]

v2可以使用norm(v2) * normalize(np)


由于v1v2的长度非常不同,因此旋转的v1只会使您构成正确的方向,但是结果向量的长度仍然具有v1的长度。您可以看到以下内容:

console.log(norm(v1), norm(np));

返回:

8.774964387392123 8.774964387392123

相关内容

  • 没有找到相关文章

最新更新