取景距离抬到不会让轨道缩放范围颠倒的下限

- packages/model3d-viewer/src/framing.ts:computeModel3dViewerFitDistance 对调用方传入的距离加下限(radius × 0.2 / 8),避免 distance 过小时 maxDistance 小于 minDistance,取景与轨道钳制同时失效
- packages/model3d-viewer/src/framing.test.ts:补极小距离的下限用例
This commit is contained in:
2026-09-24 17:23:31 +08:00
parent 3624f454e2
commit 55ce6d7129
2 changed files with 21 additions and 1 deletions
@@ -143,6 +143,20 @@ describe('computeModel3dViewerFitDistance', () => {
expect(distance).toBe(7);
});
it('传入的距离小到会让缩放范围颠倒时,抬到能站住的下限', () => {
const framing = computeModel3dViewerFraming({
box: CUBE,
aspect: 1,
distance: computeModel3dViewerFitDistance({
box: CUBE,
aspect: 1,
distance: 0.001,
}),
});
expect(framing.maxDistance).toBeGreaterThanOrEqual(framing.minDistance);
});
});
describe('createModel3dViewerFitSolver', () => {
+7 -1
View File
@@ -218,7 +218,13 @@ export function computeModel3dViewerFitDistance(
// 会让 maxDistance 小于 minDistance,取景与轨道钳制一起失效,故按无效处理。
const distance = input.distance;
if (distance !== undefined && Number.isFinite(distance) && distance > 0) {
return distance;
// `computeModel3dViewerFraming` 由这个距离推出 maxDistance = distance × 8、minDistance
// = radius × 0.2;距离小到 0.025 × radius 以下时两者会颠倒,取景与轨道钳制一起失效。
return Math.max(
distance,
(computeModel3dViewerBoxRadius(input.box) * MIN_DISTANCE_RATIO) /
MAX_DISTANCE_RATIO,
);
}
const solver = createModel3dViewerFitSolver({
center: computeModel3dViewerBoxCenter(input.box),