fix: 轴可见度阈值 0.35→0.034(量纲修正,0.35 会隐藏所有轴)

前次 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° 可拖。
This commit is contained in:
2026-10-03 02:02:37 +08:00
parent 5cc9b14d73
commit af241857af
+7 -6
View File
@@ -146,12 +146,13 @@ std::optional<entt::entity> 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(模型轴,旋转/缩放随物体朝向直观)/