如何在 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)

如果矩阵向量乘法是从左边开始,这同样适用。