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:
@@ -146,12 +146,13 @@ std::optional<entt::entity> ViewportPanel::Draw(const EditorContext &ctx,
|
|||||||
const ImVec2 mn = ImGui::GetItemRectMin();
|
const ImVec2 mn = ImGui::GetItemRectMin();
|
||||||
ImGuizmo::SetRect(mn.x, mn.y, size.x, size.y);
|
ImGuizmo::SetRect(mn.x, mn.y, size.x, size.y);
|
||||||
|
|
||||||
// 轴可见度阈值(默认 0.02 太小):正对视角下轴投影长度
|
// 轴可见度阈值:库内轴恒定屏幕尺寸(mGizmoSizeClipSpace
|
||||||
// sinθ 在阈值上方 → "看得见但几何上不可操作"——⊥视线
|
// =0.1),可见判定 = sinθ(轴与视线夹角) > 阈值/0.1。
|
||||||
// 的轴悬停检测失效(射线∥垂直平面,denom=0)、∥视线
|
// 默认 0.02 ⇒ θ>11.5° 就可见——"有高度差"的正对视角
|
||||||
// 的轴拖拽无一阶位移(怎么拖都不动)。UE 语义 = 正对
|
// (θ≈15°)轴"看得见但几何上不可操作"(⊥视线轴悬停
|
||||||
// 轴直接隐藏:0.35 ⇒ 夹角 <20° 的轴消失,>20° 可拖
|
// 失效、∥视线轴拖拽无一阶位移)。取 0.034 ⇒ θ<20° 的
|
||||||
ImGuizmo::SetPlaneLimit(0.35f);
|
// 轴隐藏(UE 正对轴隐藏语义),≥20° 正常可拖
|
||||||
|
ImGuizmo::SetPlaneLimit(0.034f);
|
||||||
|
|
||||||
glm::mat4 m = tr->World();
|
glm::mat4 m = tr->World();
|
||||||
// 操作空间:local(模型轴,旋转/缩放随物体朝向直观)/
|
// 操作空间:local(模型轴,旋转/缩放随物体朝向直观)/
|
||||||
|
|||||||
Reference in New Issue
Block a user