41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import { Euler, Quaternion, Vector3 } from "three";
|
|
|
|
import type { TransformAxis } from "../core/transform-session";
|
|
import type { Vec3 } from "../core/vector";
|
|
|
|
function axisVector(axis: TransformAxis): Vector3 {
|
|
switch (axis) {
|
|
case "x":
|
|
return new Vector3(1, 0, 0);
|
|
case "y":
|
|
return new Vector3(0, 1, 0);
|
|
case "z":
|
|
return new Vector3(0, 0, 1);
|
|
}
|
|
}
|
|
|
|
export function resolveDominantLocalAxisForWorldAxis(
|
|
rotationDegrees: Vec3,
|
|
worldAxis: TransformAxis
|
|
): TransformAxis {
|
|
const orientation = new Quaternion().setFromEuler(
|
|
new Euler(
|
|
(rotationDegrees.x * Math.PI) / 180,
|
|
(rotationDegrees.y * Math.PI) / 180,
|
|
(rotationDegrees.z * Math.PI) / 180,
|
|
"XYZ"
|
|
)
|
|
);
|
|
const localAxis = axisVector(worldAxis)
|
|
.applyQuaternion(orientation.invert())
|
|
.normalize();
|
|
const axisWeights: Array<[TransformAxis, number]> = [
|
|
["x", Math.abs(localAxis.x)],
|
|
["y", Math.abs(localAxis.y)],
|
|
["z", Math.abs(localAxis.z)]
|
|
];
|
|
|
|
axisWeights.sort((left, right) => right[1] - left[1]);
|
|
return axisWeights[0]?.[0] ?? worldAxis;
|
|
}
|