fix: 优化Gizmo
This commit is contained in:
@@ -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[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user