Rodrigues#39; formula for vector rotation(罗德里格斯矢量旋转公式)
本文介绍了罗德里格斯矢量旋转公式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
所以我从两个向量开始,我得到它们之间的角度,我得到垂直向量,并将其归一化,然后我测试我的矩阵,看看如果我输入v1,是否会得到v2。但我还是没把它弄回来。有人知道我做错了什么吗。我想它在矩阵代码中。我回来了问题描述
我在试着做罗德里格斯公式,绕着任意轴旋转一定角度。我有此代码 数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">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.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)
找到。
因为v1
和v2
的长度非常不同,所以旋转v1
只能得到正确的方向,但生成的向量的长度仍然是v1
。您可以通过以下命令查看:
console.log(norm(v1), norm(np));
退货:
8.774964387392123
8.774964387392123
这篇关于罗德里格斯矢量旋转公式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:罗德里格斯矢量旋转公式
基础教程推荐
猜你喜欢
- 动态更新多个选择框 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 在for循环中使用setTimeout 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01