Add transform axis mapping functionality
This commit is contained in:
40
src/viewport-three/transform-axis-mapping.ts
Normal file
40
src/viewport-three/transform-axis-mapping.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user