如何围绕任意轴旋转矢量?
how to rotate a vector around an arbitrary axis?
我有一个轴,由 2 个向量定义,例如一个指向上方 x = 10
:
const axisStart = new Vector3(10, 0, 0)
const axisEnd = new Vector3(10, 0, 1)
我得到了标准化的轴方向,如下所示:
const axisDirection = new Vector3().subVectors(axisEnd, axisStart).normalize()
如何旋转矢量(例如Vector3(50, 0, 0)
)围绕我的原始轴?
我试过使用 Vector3.applyAxisAngle(axisDirection , radians)
,但是因为轴已经标准化,旋转发生在世界中心 (0, 0) 而不是轴的原始位置。
我通过使用 this answer 找到点旋转所围绕的轴上的确切点并将伪代码从它翻译成打字稿来解决这个问题:
getPivotPoint(pointToRotate: Vector3, axisStart: Vector3, axisEnd: Vector3) {
const d = new Vector3().subVectors(axisEnd, axisStart).normalize()
const v = new Vector3().subVectors(pointToRotate, axisStart)
const t = v.dot(d)
const pivotPoint = axisStart.add(d.multiplyScalar(t))
return pivotPoint
}
然后,正如@Ouroborus 指出的那样,我可以平移点,应用旋转,然后将其平移回来:
rotatePointAroundAxis(pointToRotate: Vector3, axisStart: Vector3, axisEnd, radians: number) {
const axisDirection = new Vector3().subVectors(axisEnd, axisStart).normalize()
const pivotPoint = getPivotPoint(pointToRotate, axisStart, axisEnd)
const translationToWorldCenter = new Vector3().subVectors(pointToRotate, pivotPoint)
const translatedRotated = translationToWorldCenter.clone().applyAxisAngle(axisDirection, radians)
const destination = pointToRotate.clone().add(translatedRotated).sub(translationToWorldCenter)
return destination
}
上面的代码运行良好,留在这里供我未来的自己和其他可能觉得有用的人使用。
我有一个轴,由 2 个向量定义,例如一个指向上方 x = 10
:
const axisStart = new Vector3(10, 0, 0)
const axisEnd = new Vector3(10, 0, 1)
我得到了标准化的轴方向,如下所示:
const axisDirection = new Vector3().subVectors(axisEnd, axisStart).normalize()
如何旋转矢量(例如Vector3(50, 0, 0)
)围绕我的原始轴?
我试过使用 Vector3.applyAxisAngle(axisDirection , radians)
,但是因为轴已经标准化,旋转发生在世界中心 (0, 0) 而不是轴的原始位置。
我通过使用 this answer 找到点旋转所围绕的轴上的确切点并将伪代码从它翻译成打字稿来解决这个问题:
getPivotPoint(pointToRotate: Vector3, axisStart: Vector3, axisEnd: Vector3) {
const d = new Vector3().subVectors(axisEnd, axisStart).normalize()
const v = new Vector3().subVectors(pointToRotate, axisStart)
const t = v.dot(d)
const pivotPoint = axisStart.add(d.multiplyScalar(t))
return pivotPoint
}
然后,正如@Ouroborus 指出的那样,我可以平移点,应用旋转,然后将其平移回来:
rotatePointAroundAxis(pointToRotate: Vector3, axisStart: Vector3, axisEnd, radians: number) {
const axisDirection = new Vector3().subVectors(axisEnd, axisStart).normalize()
const pivotPoint = getPivotPoint(pointToRotate, axisStart, axisEnd)
const translationToWorldCenter = new Vector3().subVectors(pointToRotate, pivotPoint)
const translatedRotated = translationToWorldCenter.clone().applyAxisAngle(axisDirection, radians)
const destination = pointToRotate.clone().add(translatedRotated).sub(translationToWorldCenter)
return destination
}
上面的代码运行良好,留在这里供我未来的自己和其他可能觉得有用的人使用。