|
|
@@ -4,8 +4,13 @@ import {
|
|
|
import {
|
|
|
fovToFocalLength,
|
|
|
} from "@/shared/videoFrustum";
|
|
|
+import { computeAutoHorizonCut } from "@/shared/videoHorizon";
|
|
|
import type { Vec3 } from "@/shared/vec3";
|
|
|
-import type { VideoData, VideoProjectorFields } from "@/storeDB/videos";
|
|
|
+import {
|
|
|
+ VIDEO_VIEW_FADE_DEFAULTS,
|
|
|
+ type VideoData,
|
|
|
+ type VideoProjectorFields,
|
|
|
+} from "@/storeDB/videos";
|
|
|
import {
|
|
|
Cartesian3,
|
|
|
Cartographic,
|
|
|
@@ -65,8 +70,26 @@ export type VideoProjectorParams = {
|
|
|
quadCorners: QuadCornersUv;
|
|
|
flipX?: boolean;
|
|
|
flipY?: boolean;
|
|
|
+ /** 掠射角衰减阈值(N·L 下界),0 关闭 */
|
|
|
+ grazeFade: number;
|
|
|
+ /** 地平线裁切上界,1 不裁切 */
|
|
|
+ horizonCut: number;
|
|
|
+ /** horizonCut 跟随 elevation/fov/aspect 自动推算 */
|
|
|
+ horizonAuto: boolean;
|
|
|
+ /** 观察者偏离主轴时回退为视频幕布 */
|
|
|
+ screenEnabled: boolean;
|
|
|
+ /** 幕布距相机距离,0 表示取 far */
|
|
|
+ screenDistance: number;
|
|
|
+ viewAngleInner: number;
|
|
|
+ viewAngleFade: number;
|
|
|
};
|
|
|
|
|
|
+/** horizonAuto 打开时由视锥参数推算,否则用手动值 */
|
|
|
+export const resolveHorizonCut = (params: VideoProjectorParams): number =>
|
|
|
+ params.horizonAuto
|
|
|
+ ? computeAutoHorizonCut(params.elevation, params.fov, params.aspect)
|
|
|
+ : params.horizonCut;
|
|
|
+
|
|
|
export const lonLatHeightToEcef = (
|
|
|
lon: number,
|
|
|
lat: number,
|
|
|
@@ -125,6 +148,7 @@ export const VID3D_DEMO_DEFAULTS = {
|
|
|
azimuth: 0,
|
|
|
elevation: -30,
|
|
|
roll: 0,
|
|
|
+ grazeFade: 0.25,
|
|
|
} as const;
|
|
|
|
|
|
export const createDefaultProjectorParams = (options: {
|
|
|
@@ -162,6 +186,13 @@ export const createDefaultProjectorParams = (options: {
|
|
|
[1, 1],
|
|
|
[0, 1],
|
|
|
] as QuadCornersUv,
|
|
|
+ grazeFade: VID3D_DEMO_DEFAULTS.grazeFade,
|
|
|
+ horizonCut: 1,
|
|
|
+ horizonAuto: true,
|
|
|
+ screenEnabled: false,
|
|
|
+ screenDistance: 0,
|
|
|
+ viewAngleInner: VIDEO_VIEW_FADE_DEFAULTS.viewAngleInner,
|
|
|
+ viewAngleFade: VIDEO_VIEW_FADE_DEFAULTS.viewAngleFade,
|
|
|
});
|
|
|
|
|
|
/** 由 lon/lat/hei 得到 ECEF */
|
|
|
@@ -210,6 +241,14 @@ export const videoDataToProjectorParams = (
|
|
|
quadCorners: data.quadCorners.map((c) => [...c]) as QuadCornersUv,
|
|
|
flipX: data.flipX,
|
|
|
flipY: data.flipY,
|
|
|
+ grazeFade: data.grazeFade ?? VID3D_DEMO_DEFAULTS.grazeFade,
|
|
|
+ horizonCut: data.horizonCut ?? 1,
|
|
|
+ horizonAuto: data.horizonAuto ?? true,
|
|
|
+ screenEnabled: data.screenEnabled ?? false,
|
|
|
+ screenDistance: data.screenDistance ?? 0,
|
|
|
+ viewAngleInner:
|
|
|
+ data.viewAngleInner ?? VIDEO_VIEW_FADE_DEFAULTS.viewAngleInner,
|
|
|
+ viewAngleFade: data.viewAngleFade ?? VIDEO_VIEW_FADE_DEFAULTS.viewAngleFade,
|
|
|
});
|
|
|
|
|
|
export const projectorParamsToVideoProjectorFields = (
|
|
|
@@ -237,6 +276,13 @@ export const projectorParamsToVideoProjectorFields = (
|
|
|
flipX: params.flipX ?? false,
|
|
|
flipY: params.flipY ?? false,
|
|
|
focalLength: fovToFocalLength(params.fov),
|
|
|
+ grazeFade: params.grazeFade,
|
|
|
+ horizonCut: resolveHorizonCut(params),
|
|
|
+ horizonAuto: params.horizonAuto,
|
|
|
+ screenEnabled: params.screenEnabled,
|
|
|
+ screenDistance: params.screenDistance,
|
|
|
+ viewAngleInner: params.viewAngleInner,
|
|
|
+ viewAngleFade: params.viewAngleFade,
|
|
|
});
|
|
|
|
|
|
export const buildVideoProjectorParamsFromData = (
|
|
|
@@ -273,6 +319,8 @@ export const buildCesiumProjectorOptions = (
|
|
|
params.flipX,
|
|
|
params.flipY,
|
|
|
),
|
|
|
+ grazeFade: params.grazeFade,
|
|
|
+ horizonCut: resolveHorizonCut(params),
|
|
|
});
|
|
|
|
|
|
export const applyVideoProjectorParams = (
|
|
|
@@ -298,6 +346,8 @@ export const applyVideoProjectorParams = (
|
|
|
params.flipX,
|
|
|
params.flipY,
|
|
|
);
|
|
|
+ tool.grazeFade = params.grazeFade;
|
|
|
+ tool.horizonCut = resolveHorizonCut(params);
|
|
|
};
|
|
|
|
|
|
type CesiumProjectorToolLike = {
|
|
|
@@ -317,6 +367,8 @@ type CesiumProjectorToolLike = {
|
|
|
cropRect: [number, number, number, number];
|
|
|
cropPolygon: CropPolygonUv;
|
|
|
quadCorners: CesiumProjectorOptions["quadCorners"];
|
|
|
+ grazeFade: number;
|
|
|
+ horizonCut: number;
|
|
|
};
|
|
|
|
|
|
/** 钢笔绘制后同步外接矩形,便于兼容旧字段 */
|