如何为四元数从自定义点而不是 (0, 0, 0) 开始创建 Vector3

How to create Vector3 started from custom point instead of (0, 0, 0) for quaternion

在 three.js 场景中,我有 LineLoop 横跨 6 个点,位于图片的平面上。 我注意围绕矢量 A'B'(绿色圆角箭头)旋转它。

我的管道:

  1. 计算点向量
let pointVector = new Vector3().fromArray([x, y, z])
  1. 为 movemnet 设置向量
const move = new Vector3(xMove, yMove, zMove)
  1. 设置旋转方向矢量
const zNormalVector = new THREE.Vector3(0, 0, 1)
  1. 设置旋转角度
const zAngle = Math.PI/6
  1. 用向量和角度计算四元数
const zQuaternion = new Quaternion().setFromAxisAngle(zNormalVector, zAngle)
  1. 将移动向量添加到从 1 开始的每个点。
pointVector.add(move)
  1. 对从 1 开始的每个点应用四元数。
pointVector.applyQuaternion(zQuaternion)

有了“移动”这个操作就OK了,但是“旋转”这个操作我就纳闷了。

显然,准确执行此算法会导致沿红色箭头而不是绿色箭头旋转。

指定坐标Y增加的旋转向量导致旋转轴倾斜,不移动,我在文档中没有找到如何设置向量的起点。

或许类似的问题可以通过.worldToLocal和.localToWorld方法解决,但是Vector3不是Object3D的实例

UPD 1docs 我发现: 3D 中的方向和长度space。在 three.js 中,长度始终是从 (0, 0, 0) 到 (x, y, z) 的欧几里得距离(直线距离),方向也是从 (0, 0, 0) 测量的朝向 (x, y, z).

这意味着我的问题没有答案。但是我怎样才能像绿色箭头一样旋转我的对象?

您想要的是平移旋转,即绕不通过原点的轴旋转。

有几种方法可以做到这一点,下面是一种简单的方法。令 T 为平移算子,R 为旋转算子,T^-1 为逆平移,即与 T 相同但方向相反。那么你想要的转换是:

平移旋转 = T * R * T^-1

*是运算符的组合(或函数的组合),在矩阵语言中可以是“矩阵乘积”。

所以给定一个点x,绕平移轴的旋转是

x' = T * R * T^-1 * x

T和R的实现可以是任意的。 T可以是向量加法,R可以是四元数。