fix: 优化Gizmo

This commit is contained in:
2026-09-18 03:06:34 +08:00
parent 8645ea3007
commit 9b72f10b43
23 changed files with 787 additions and 254 deletions

View File

@@ -129,17 +129,26 @@ export interface DirectorTrajectoryPointRef {
}
/**
* 轨迹点朝向角的取值范围(度),下标与 DirectorTrajectoryPoint.rotation 一致:
* - 0 俯仰角 pitch(X):-90 – 90(趴着 ↔ 躺着,物理限位,不是整圈)
* - 1 水平角 yaw(Y):0 – 360(绕身体竖直轴转一整圈)
* - 2 横滚角 roll(Z):-180 – 180(绕身体前后轴侧倾一整圈)
* 朝向角的取值范围(度),下标与 rotation 一致:
* - 0 俯仰角 pitch(X):-90 – 90(趴着 ↔ 躺着 / 镜头俯视 ↔ 仰视,物理限位,不是整圈)
* - 1 水平角 yaw(Y):0 – 360(绕竖直轴转一整圈)
* - 2 横滚角 roll(Z):-180 – 180(绕前后轴侧倾一整圈)
*
* 轨迹点(DirectorTrajectoryPoint.rotation)与机位注视(DirectorCameraShot.lookRotation)
* 共用这一套语义,保证「角色朝向」和「镜头朝向」在面板上的读数是同一套语言。
*/
export const TRAJECTORY_ROTATION_LIMITS: Record<0 | 1 | 2, { min: number; max: number }> = {
export const ORIENTATION_ROTATION_LIMITS: Record<0 | 1 | 2, { min: number; max: number }> = {
0: { min: -90, max: 90 },
1: { min: 0, max: 360 },
2: { min: -180, max: 180 },
};
/** 轨迹点朝向角的取值范围(度):通用朝向角语义的别名 */
export const TRAJECTORY_ROTATION_LIMITS = ORIENTATION_ROTATION_LIMITS;
/** 机位注视朝向的取值范围(度):与轨迹点完全一致 */
export const CAMERA_ROTATION_LIMITS = ORIENTATION_ROTATION_LIMITS;
export const DEGREES_TO_RADIANS = Math.PI / 180;
export const RADIANS_TO_DEGREES = 180 / Math.PI;
@@ -183,18 +192,24 @@ export function wrapAngleIntoRange(value: number, min: number, max: number): num
* - 水平角 / 横滚角是整圈,越界按模收敛(360° ≡ 0°、181° ≡ -179°),端点保留。
* - 非法值按 0 处理。
*/
export function normalizeTrajectoryRotation(axis: 0 | 1 | 2, value: number): number {
export function normalizeOrientationRotation(axis: 0 | 1 | 2, value: number): number {
if (!Number.isFinite(value)) return 0;
if (axis === 0) {
const { min, max } = TRAJECTORY_ROTATION_LIMITS[0];
const { min, max } = ORIENTATION_ROTATION_LIMITS[0];
return Math.min(max, Math.max(min, value));
}
const { min, max } = TRAJECTORY_ROTATION_LIMITS[axis];
const { min, max } = ORIENTATION_ROTATION_LIMITS[axis];
return wrapAngleIntoRange(value, min, max);
}
/** 轨迹点朝向角归一化(沿用通用朝向角规则,保留原名便于按语义调用) */
export const normalizeTrajectoryRotation = normalizeOrientationRotation;
/** 机位注视朝向角归一化(与轨迹点同一套规则:俯仰角夹紧、水平角 / 横滚角按整圈取模) */
export const normalizeCameraRotation = normalizeOrientationRotation;
/** 角色 / 道具 / 群众变换旋转的取值范围(度):每个轴都是 0–360° 一整圈。 */
export const TRANSFORM_ROTATION_LIMITS = { min: 0, max: 360 } as const;
@@ -254,7 +269,17 @@ export interface DirectorCameraShot {
transform: DirectorTransform;
targetMode: "manual" | "object";
targetObjectId?: string | null;
target: [number, number, number];
/**
* 机位的注视朝向(度),顺序与 DirectorTrajectoryPoint.rotation 完全一致:
* [俯仰角 pitch(X), 水平角 yaw(Y), 横滚角 roll(Z)]。
* 语义(镜头朝 +Z、机顶朝 +Y):
* - 俯仰角 +90° = 垂直俯视(镜头朝下)、-90° = 垂直仰视(镜头朝上)
* - 水平角 0–360° 是一整圈(360° ≡ 0°)
* - 横滚角 -180° – 180° 是一整圈(180° ≡ -180°)
* 合成顺序是 YXZ(先横滚、再俯仰、最后水平),保证俯仰 / 横滚始终绕镜头自身轴,
* 详细换算见 cameraGeometry。
*/
lookRotation: [number, number, number];
lastCaptureUrl?: string | null;
captures?: DirectorCameraCapture[];
}