如何为四元数从自定义点而不是 (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'(绿色圆角箭头)旋转它。
我的管道:
- 计算点向量
let pointVector = new Vector3().fromArray([x, y, z])
- 为 movemnet 设置向量
const move = new Vector3(xMove, yMove, zMove)
- 设置旋转方向矢量
const zNormalVector = new THREE.Vector3(0, 0, 1)
- 设置旋转角度
const zAngle = Math.PI/6
- 用向量和角度计算四元数
const zQuaternion = new Quaternion().setFromAxisAngle(zNormalVector, zAngle)
- 将移动向量添加到从 1 开始的每个点。
pointVector.add(move)
- 对从 1 开始的每个点应用四元数。
pointVector.applyQuaternion(zQuaternion)
有了“移动”这个操作就OK了,但是“旋转”这个操作我就纳闷了。
显然,准确执行此算法会导致沿红色箭头而不是绿色箭头旋转。
指定坐标Y增加的旋转向量导致旋转轴倾斜,不移动,我在文档中没有找到如何设置向量的起点。
或许类似的问题可以通过.worldToLocal和.localToWorld方法解决,但是Vector3不是Object3D的实例
UPD 1
在 docs 我发现:
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可以是四元数。
在 three.js 场景中,我有 LineLoop 横跨 6 个点,位于图片的平面上。 我注意围绕矢量 A'B'(绿色圆角箭头)旋转它。
我的管道:
- 计算点向量
let pointVector = new Vector3().fromArray([x, y, z])
- 为 movemnet 设置向量
const move = new Vector3(xMove, yMove, zMove)
- 设置旋转方向矢量
const zNormalVector = new THREE.Vector3(0, 0, 1)
- 设置旋转角度
const zAngle = Math.PI/6
- 用向量和角度计算四元数
const zQuaternion = new Quaternion().setFromAxisAngle(zNormalVector, zAngle)
- 将移动向量添加到从 1 开始的每个点。
pointVector.add(move)
- 对从 1 开始的每个点应用四元数。
pointVector.applyQuaternion(zQuaternion)
有了“移动”这个操作就OK了,但是“旋转”这个操作我就纳闷了。
显然,准确执行此算法会导致沿红色箭头而不是绿色箭头旋转。
指定坐标Y增加的旋转向量导致旋转轴倾斜,不移动,我在文档中没有找到如何设置向量的起点。
或许类似的问题可以通过.worldToLocal和.localToWorld方法解决,但是Vector3不是Object3D的实例
UPD 1 在 docs 我发现: 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可以是四元数。