From af241857af33b1d1cece07b1be702b2fb25c5bc4 Mon Sep 17 00:00:00 2001 From: atdunbg Date: Sat, 3 Oct 2026 02:02:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BD=B4=E5=8F=AF=E8=A7=81=E5=BA=A6?= =?UTF-8?q?=E9=98=88=E5=80=BC=200.35=E2=86=920.034=EF=BC=88=E9=87=8F?= =?UTF-8?q?=E7=BA=B2=E4=BF=AE=E6=AD=A3=EF=BC=8C0.35=20=E4=BC=9A=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E6=89=80=E6=9C=89=E8=BD=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前次 0.35 的错误:把阈值当成 0~1 的 sinθ 直接比较。实际库内 gizmo 恒定屏幕尺寸(mGizmoSizeClipSpace=0.1),可见判定 = sinθ > 阈值/0.1 —— 0.35 ⇒ sinθ>3.5 永假 ⇒ 所有轴消失。 仿真量纲(MVP 复刻 + ScreenFactor 机制确认):⊥视线轴 clip 长度 恒 ≈0.97·screenFactor=gizmoSize;视线向轴 = gizmoSize·sinθ。 0.034 ⇒ sinθ>0.34 ⇒ θ<20° 隐藏(UE 正对轴隐藏语义),≥20° 可拖。 --- App/editor/ViewportPanel.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/App/editor/ViewportPanel.cpp b/App/editor/ViewportPanel.cpp index 1650780..6ad270c 100644 --- a/App/editor/ViewportPanel.cpp +++ b/App/editor/ViewportPanel.cpp @@ -146,12 +146,13 @@ std::optional ViewportPanel::Draw(const EditorContext &ctx, const ImVec2 mn = ImGui::GetItemRectMin(); ImGuizmo::SetRect(mn.x, mn.y, size.x, size.y); - // 轴可见度阈值(默认 0.02 太小):正对视角下轴投影长度 - // sinθ 在阈值上方 → "看得见但几何上不可操作"——⊥视线 - // 的轴悬停检测失效(射线∥垂直平面,denom=0)、∥视线 - // 的轴拖拽无一阶位移(怎么拖都不动)。UE 语义 = 正对 - // 轴直接隐藏:0.35 ⇒ 夹角 <20° 的轴消失,>20° 可拖 - ImGuizmo::SetPlaneLimit(0.35f); + // 轴可见度阈值:库内轴恒定屏幕尺寸(mGizmoSizeClipSpace + // =0.1),可见判定 = sinθ(轴与视线夹角) > 阈值/0.1。 + // 默认 0.02 ⇒ θ>11.5° 就可见——"有高度差"的正对视角 + // (θ≈15°)轴"看得见但几何上不可操作"(⊥视线轴悬停 + // 失效、∥视线轴拖拽无一阶位移)。取 0.034 ⇒ θ<20° 的 + // 轴隐藏(UE 正对轴隐藏语义),≥20° 正常可拖 + ImGuizmo::SetPlaneLimit(0.034f); glm::mat4 m = tr->World(); // 操作空间:local(模型轴,旋转/缩放随物体朝向直观)/