【问题标题】:How to create Vector3 started from custom point instead of (0, 0, 0) for quaternion如何从自定义点而不是四元数的 (0, 0, 0) 开始创建 Vector3
【发布时间】:2020-08-26 11:44:50
【问题描述】:

在 three.js 场景中,我在图片上的 6 个点上有 LineLoop。 我注意围绕向量 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)

“运动”操作一切正常,但“旋转”操作让我感到困惑。

显然,该算法的精确执行导致沿红色箭头而不是绿色箭头旋转。

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

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

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

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

【问题讨论】:

标签: vector three.js quaternions


【解决方案1】:

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

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

TranslatedRotation = T * R * T^-1

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多