如何在 Javascript 中围绕任意原点旋转任意点
How can I rotate an arbitrary point around an arbitrary origin in Javascript
使用这个问题: 我能够在 javascript.
中为我的任意向量库吸收一个基本的旋转函数
问题是,上面的问题没有解释如何绕任何点旋转(如轨道)
这个向量库扩展了 Array 对象类型(我最初是从一个旧项目中派生出来的,然后为我自己的项目改编),所以把每个向量想象成一个带有额外方法和 getter 的数组(你可以找到完整的源代码 here)
这是我用来旋转当前向量的方法,插入一个Vector作为角度(这样每个轴都可以单独控制)
它获取所有三个轴(俯仰、滚动、偏航)所需的余弦和正弦值,然后将它们作为三个向量存储在一个数组中。
最后将每个向量乘以相应的坐标。
rotate(angle) {
let cos = (angle.copy).map(val => Math.cos(angle));
let sin = (angle.copy).map(val => Math.sin(angle));
let other = [new Vector([
cos.z * cos.y,
cos.z * sin.y * sin.x - sin.z * cos.x,
cos.z * sin.y * cos.x + sin.z * sin.x
]), new Vector([
sin.z * cos.y,
sin.z * sin.y * sin.x + cos.z * cos.x,
sin.z * sin.y * cos.x - cos.z * sin.x
]), new Vector([
-sin.y,
cos.y * sin.x,
cos.y * cos.x
])];
let stored = point.copy;
this.map((val, i) => (other[i].mul(stored)).sum);
}
我的主要问题是,如何调整此工具以允许我围绕 3D 中的任何点旋转 space
如果你有一个旋转矩阵 R
并且想要围绕一个点 a
旋转一个向量 v
,那么结果的公式是
a + R * (v-a)
如果矩阵向量乘法是从左边开始,这同样适用。
使用这个问题:
问题是,上面的问题没有解释如何绕任何点旋转(如轨道)
这个向量库扩展了 Array 对象类型(我最初是从一个旧项目中派生出来的,然后为我自己的项目改编),所以把每个向量想象成一个带有额外方法和 getter 的数组(你可以找到完整的源代码 here)
这是我用来旋转当前向量的方法,插入一个Vector作为角度(这样每个轴都可以单独控制)
它获取所有三个轴(俯仰、滚动、偏航)所需的余弦和正弦值,然后将它们作为三个向量存储在一个数组中。
最后将每个向量乘以相应的坐标。
rotate(angle) {
let cos = (angle.copy).map(val => Math.cos(angle));
let sin = (angle.copy).map(val => Math.sin(angle));
let other = [new Vector([
cos.z * cos.y,
cos.z * sin.y * sin.x - sin.z * cos.x,
cos.z * sin.y * cos.x + sin.z * sin.x
]), new Vector([
sin.z * cos.y,
sin.z * sin.y * sin.x + cos.z * cos.x,
sin.z * sin.y * cos.x - cos.z * sin.x
]), new Vector([
-sin.y,
cos.y * sin.x,
cos.y * cos.x
])];
let stored = point.copy;
this.map((val, i) => (other[i].mul(stored)).sum);
}
我的主要问题是,如何调整此工具以允许我围绕 3D 中的任何点旋转 space
如果你有一个旋转矩阵 R
并且想要围绕一个点 a
旋转一个向量 v
,那么结果的公式是
a + R * (v-a)
如果矩阵向量乘法是从左边开始,这同样适用。